From: <fwi...@us...> - 2006-06-13 11:33:24
|
Revision: 2819 Author: fwierzbicki Date: 2006-06-13 04:33:10 -0700 (Tue, 13 Jun 2006) ViewCVS: http://svn.sourceforge.net/jython/?rev=2819&view=rev Log Message: ----------- new bool type. Added Paths: ----------- branches/2.3/src/org/python/core/PyBoolean.java branches/2.3/src/org/python/core/PyBooleanDerived.java Added: branches/2.3/src/org/python/core/PyBoolean.java =================================================================== --- branches/2.3/src/org/python/core/PyBoolean.java (rev 0) +++ branches/2.3/src/org/python/core/PyBoolean.java 2006-06-13 11:33:10 UTC (rev 2819) @@ -0,0 +1,489 @@ +package org.python.core; + +import java.io.Serializable; + +public class PyBoolean extends PyInteger { + +/** + * A builtin python bool. + */ + //~ BEGIN GENERATED REGION -- DO NOT EDIT SEE gexpose.py + /* type info */ + + public static final String exposed_name="bool"; + + public static void typeSetup(PyObject dict,PyType.Newstyle marker) { + class exposed___abs__ extends PyBuiltinFunctionNarrow { + + private PyBoolean self; + + public PyObject getSelf() { + return self; + } + + exposed___abs__(PyBoolean self,PyBuiltinFunction.Info info) { + super(info); + this.self=self; + } + + public PyBuiltinFunction makeBound(PyObject self) { + return new exposed___abs__((PyBoolean)self,info); + } + + public PyObject __call__() { + return self.bool___abs__(); + } + + public PyObject inst_call(PyObject gself) { + PyBoolean self=(PyBoolean)gself; + return self.bool___abs__(); + } + + } + dict.__setitem__("__abs__",new PyMethodDescr("__abs__",PyBoolean.class,0,0,new exposed___abs__(null,null))); + class exposed___neg__ extends PyBuiltinFunctionNarrow { + + private PyBoolean self; + + public PyObject getSelf() { + return self; + } + + exposed___neg__(PyBoolean self,PyBuiltinFunction.Info info) { + super(info); + this.self=self; + } + + public PyBuiltinFunction makeBound(PyObject self) { + return new exposed___neg__((PyBoolean)self,info); + } + + public PyObject __call__() { + return self.bool___neg__(); + } + + public PyObject inst_call(PyObject gself) { + PyBoolean self=(PyBoolean)gself; + return self.bool___neg__(); + } + + } + dict.__setitem__("__neg__",new PyMethodDescr("__neg__",PyBoolean.class,0,0,new exposed___neg__(null,null))); + class exposed___pos__ extends PyBuiltinFunctionNarrow { + + private PyBoolean self; + + public PyObject getSelf() { + return self; + } + + exposed___pos__(PyBoolean self,PyBuiltinFunction.Info info) { + super(info); + this.self=self; + } + + public PyBuiltinFunction makeBound(PyObject self) { + return new exposed___pos__((PyBoolean)self,info); + } + + public PyObject __call__() { + return self.bool___pos__(); + } + + public PyObject inst_call(PyObject gself) { + PyBoolean self=(PyBoolean)gself; + return self.bool___pos__(); + } + + } + dict.__setitem__("__pos__",new PyMethodDescr("__pos__",PyBoolean.class,0,0,new exposed___pos__(null,null))); + class exposed___and__ extends PyBuiltinFunctionNarrow { + + private PyBoolean self; + + public PyObject getSelf() { + return self; + } + + exposed___and__(PyBoolean self,PyBuiltinFunction.Info info) { + super(info); + this.self=self; + } + + public PyBuiltinFunction makeBound(PyObject self) { + return new exposed___and__((PyBoolean)self,info); + } + + public PyObject __call__(PyObject arg0) { + PyObject ret=self.bool___and__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; + } + + public PyObject inst_call(PyObject gself,PyObject arg0) { + PyBoolean self=(PyBoolean)gself; + PyObject ret=self.bool___and__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; + } + + } + dict.__setitem__("__and__",new PyMethodDescr("__and__",PyBoolean.class,1,1,new exposed___and__(null,null))); + class exposed___or__ extends PyBuiltinFunctionNarrow { + + private PyBoolean self; + + public PyObject getSelf() { + return self; + } + + exposed___or__(PyBoolean self,PyBuiltinFunction.Info info) { + super(info); + this.self=self; + } + + public PyBuiltinFunction makeBound(PyObject self) { + return new exposed___or__((PyBoolean)self,info); + } + + public PyObject __call__(PyObject arg0) { + PyObject ret=self.bool___or__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; + } + + public PyObject inst_call(PyObject gself,PyObject arg0) { + PyBoolean self=(PyBoolean)gself; + PyObject ret=self.bool___or__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; + } + + } + dict.__setitem__("__or__",new PyMethodDescr("__or__",PyBoolean.class,1,1,new exposed___or__(null,null))); + class exposed___xor__ extends PyBuiltinFunctionNarrow { + + private PyBoolean self; + + public PyObject getSelf() { + return self; + } + + exposed___xor__(PyBoolean self,PyBuiltinFunction.Info info) { + super(info); + this.self=self; + } + + public PyBuiltinFunction makeBound(PyObject self) { + return new exposed___xor__((PyBoolean)self,info); + } + + public PyObject __call__(PyObject arg0) { + PyObject ret=self.bool___xor__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; + } + + public PyObject inst_call(PyObject gself,PyObject arg0) { + PyBoolean self=(PyBoolean)gself; + PyObject ret=self.bool___xor__(arg0); + if (ret==null) + return Py.NotImplemented; + return ret; + } + + } + dict.__setitem__("__xor__",new PyMethodDescr("__xor__",PyBoolean.class,1,1,new exposed___xor__(null,null))); + class exposed___nonzero__ extends PyBuiltinFunctionNarrow { + + private PyBoolean self; + + public PyObject getSelf() { + return self; + } + + exposed___nonzero__(PyBoolean self,PyBuiltinFunction.Info info) { + super(info); + this.self=self; + } + + public PyBuiltinFunction makeBound(PyObject self) { + return new exposed___nonzero__((PyBoolean)self,info); + } + + public PyObject __call__() { + return Py.newBoolean(self.bool___nonzero__()); + } + + public PyObject inst_call(PyObject gself) { + PyBoolean self=(PyBoolean)gself; + return Py.newBoolean(self.bool___nonzero__()); + } + + } + dict.__setitem__("__nonzero__",new PyMethodDescr("__nonzero__",PyBoolean.class,0,0,new exposed___nonzero__(null,null))); + class exposed___repr__ extends PyBuiltinFunctionNarrow { + + private PyBoolean self; + + public PyObject getSelf() { + return self; + } + + exposed___repr__(PyBoolean self,PyBuiltinFunction.Info info) { + super(info); + this.self=self; + } + + public PyBuiltinFunction makeBound(PyObject self) { + return new exposed___repr__((PyBoolean)self,info); + } + + public PyObject __call__() { + return new PyString(self.bool_toString()); + } + + public PyObject inst_call(PyObject gself) { + PyBoolean self=(PyBoolean)gself; + return new PyString(self.bool_toString()); + } + + } + dict.__setitem__("__repr__",new PyMethodDescr("__repr__",PyBoolean.class,0,0,new exposed___repr__(null,null))); + class exposed___str__ extends PyBuiltinFunctionNarrow { + + private PyBoolean self; + + public PyObject getSelf() { + return self; + } + + exposed___str__(PyBoolean self,PyBuiltinFunction.Info info) { + super(info); + this.self=self; + } + + public PyBuiltinFunction makeBound(PyObject self) { + return new exposed___str__((PyBoolean)self,info); + } + + public PyObject __call__() { + return new PyString(self.bool_toString()); + } + + public PyObject inst_call(PyObject gself) { + PyBoolean self=(PyBoolean)gself; + return new PyString(self.bool_toString()); + } + + } + dict.__setitem__("__str__",new PyMethodDescr("__str__",PyBoolean.class,0,0,new exposed___str__(null,null))); + class exposed___hash__ extends PyBuiltinFunctionNarrow { + + private PyBoolean self; + + public PyObject getSelf() { + return self; + } + + exposed___hash__(PyBoolean self,PyBuiltinFunction.Info info) { + super(info); + this.self=self; + } + + public PyBuiltinFunction makeBound(PyObject self) { + return new exposed___hash__((PyBoolean)self,info); + } + + public PyObject __call__() { + return Py.newInteger(self.bool_hashCode()); + } + + public PyObject inst_call(PyObject gself) { + PyBoolean self=(PyBoolean)gself; + return Py.newInteger(self.bool_hashCode()); + } + + } + dict.__setitem__("__hash__",new PyMethodDescr("__hash__",PyBoolean.class,0,0,new exposed___hash__(null,null))); + dict.__setitem__("__new__",new PyNewWrapper(PyBoolean.class,"__new__",-1,-1) { + + public PyObject new_impl(boolean init,PyType subtype,PyObject[]args,String[]keywords) { + return bool_new(this,init,subtype,args,keywords); + } + + }); + } + //~ END GENERATED REGION -- DO NOT EDIT SEE gexpose.py + + public static PyObject bool_new(PyNewWrapper new_, boolean init, PyType subtype, + PyObject[] args, String[] keywords) { + ArgParser ap = new ArgParser("bool", args, keywords, new String[] { "x" }, 0); + PyObject x = ap.getPyObject(0, null); + if (x == null) { + return Py.False; + } + if (new_.for_type == subtype) { + return x.__nonzero__() ? Py.True : Py.False; + } else { + return new PyBooleanDerived(subtype, x.__nonzero__()); + } + } // xxx + + private static final PyType BOOLTYPE = PyType.fromClass(PyBoolean.class); + + private boolean value; + + public PyBoolean(PyType subType, boolean v) { + super(subType, v ? 1 : 0); + value = v; + } + + public PyBoolean(boolean v) { + this(BOOLTYPE, v); + } + + public int getValue() { + return value ? 1 : 0; + } + + public String safeRepr() throws PyIgnoreMethodTag { + return "'bool' object"; + } + + public String toString() { + return bool_toString(); + } + + final String bool_toString() { + return value ? "True" : "False"; + } + + public int hashCode() { + return bool_hashCode(); + } + + final int bool_hashCode() { + return value ? 1 : 0; + } + + private static void err_ovf(String msg) { + try { + Py.OverflowWarning(msg); + } catch (PyException exc) { + if (Py.matchException(exc, Py.OverflowWarning)) + throw Py.OverflowError(msg); + } + } + + public boolean __nonzero__() { + return bool___nonzero__(); + } + + final boolean bool___nonzero__() { + return value; + } + + public Object __tojava__(Class c) { + if (c == Integer.TYPE || c == Number.class || + c == Object.class || c == Integer.class || + c == Serializable.class) + { + return new Integer(value ? 1 : 0); + } + + if (c == Boolean.TYPE || c == Boolean.class) + return new Boolean(value); + if (c == Byte.TYPE || c == Byte.class) + return new Byte((byte)(value ? 1 : 0)); + if (c == Short.TYPE || c == Short.class) + return new Short((short)(value ? 1 : 0)); + if (c == Long.TYPE || c == Long.class) + return new Long(value ? 1 : 0); + if (c == Float.TYPE || c == Float.class) + return new Float(value ? 1 : 0); + if (c == Double.TYPE || c == Double.class) + return new Double(value ? 1 : 0); + return super.__tojava__(c); + } + + public PyObject __and__(PyObject right) { + return bool___and__(right); + } + + final PyObject bool___and__(PyObject right) { + if (right instanceof PyBoolean) { + return Py.newBoolean(value & ((PyBoolean)right).value); + } else if (right instanceof PyInteger) { + return Py.newInteger(getValue() & ((PyInteger)right).getValue()); + } else { + return null; + } + } + + public PyObject __xor__(PyObject right) { + return bool___xor__(right); + } + + final PyObject bool___xor__(PyObject right) { + if (right instanceof PyBoolean) { + return Py.newBoolean(value ^ ((PyBoolean)right).value); + } else if (right instanceof PyInteger) { + return Py.newInteger(getValue() ^ ((PyInteger)right).getValue()); + } else { + return null; + } + } + + public PyObject __or__(PyObject right) { + return bool___or__(right); + } + + final PyObject bool___or__(PyObject right) { + if (right instanceof PyBoolean) { + return Py.newBoolean(value | ((PyBoolean)right).value); + } else if (right instanceof PyInteger) { + return Py.newInteger(getValue() | ((PyInteger)right).getValue()); + } else { + return null; + } + } + + public PyObject __neg__() { + return bool___neg__(); + } + + final PyObject bool___neg__() { + return Py.newInteger(value ? -1 : 0); + } + + public PyObject __pos__() { + return bool___pos__(); + } + + final PyObject bool___pos__() { + return Py.newInteger(value ? 1 : 0); + } + + public PyObject __abs__() { + return bool___abs__(); + } + + final PyObject bool___abs__() { + return Py.newInteger(value ? 1 : 0); + } + + public long asLong(int index) { + return value ? 1 : 0; + } + + public int asInt(int index) { + return value ? 1 : 0; + } + +} Added: branches/2.3/src/org/python/core/PyBooleanDerived.java =================================================================== --- branches/2.3/src/org/python/core/PyBooleanDerived.java (rev 0) +++ branches/2.3/src/org/python/core/PyBooleanDerived.java 2006-06-13 11:33:10 UTC (rev 2819) @@ -0,0 +1,945 @@ +package org.python.core; + +public class PyBooleanDerived extends PyBoolean { + + private PyObject dict; + + public PyObject fastGetDict() { + return dict; + } + + public PyObject getDict() { + return dict; + } + + public PyBooleanDerived(PyType subtype, boolean v) { + super(subtype, v); + dict=subtype.instDict(); + } + + public PyString __str__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__str__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyString) + return(PyString)res; + throw Py.TypeError("__str__"+" should return a "+"string"); + } + return super.__str__(); + } + + public PyString __repr__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__repr__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyString) + return(PyString)res; + throw Py.TypeError("__repr__"+" should return a "+"string"); + } + return super.__repr__(); + } + + public PyString __hex__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__hex__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyString) + return(PyString)res; + throw Py.TypeError("__hex__"+" should return a "+"string"); + } + return super.__hex__(); + } + + public PyString __oct__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__oct__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyString) + return(PyString)res; + throw Py.TypeError("__oct__"+" should return a "+"string"); + } + return super.__oct__(); + } + + public PyObject __int__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__int__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyObject) + return(PyObject)res; + throw Py.TypeError("__int__"+" should return a "+"int"); + } + return super.__int__(); + } + + public PyFloat __float__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__float__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyFloat) + return(PyFloat)res; + throw Py.TypeError("__float__"+" should return a "+"float"); + } + return super.__float__(); + } + + public PyLong __long__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__long__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyLong) + return(PyLong)res; + throw Py.TypeError("__long__"+" should return a "+"long"); + } + return super.__long__(); + } + + public PyComplex __complex__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__complex__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyComplex) + return(PyComplex)res; + throw Py.TypeError("__complex__"+" should return a "+"complex"); + } + return super.__complex__(); + } + + public PyObject __pos__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__pos__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(); + return super.__pos__(); + } + + public PyObject __neg__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__neg__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(); + return super.__neg__(); + } + + public PyObject __abs__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__abs__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(); + return super.__abs__(); + } + + public PyObject __invert__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__invert__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(); + return super.__invert__(); + } + + public PyObject __reduce__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__reduce__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(); + return super.__reduce__(); + } + + public PyObject __add__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__add__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__add__(other); + } + + public PyObject __radd__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__radd__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__radd__(other); + } + + public PyObject __sub__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__sub__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__sub__(other); + } + + public PyObject __rsub__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rsub__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rsub__(other); + } + + public PyObject __mul__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__mul__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__mul__(other); + } + + public PyObject __rmul__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rmul__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rmul__(other); + } + + public PyObject __div__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__div__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__div__(other); + } + + public PyObject __rdiv__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rdiv__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rdiv__(other); + } + + public PyObject __floordiv__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__floordiv__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__floordiv__(other); + } + + public PyObject __rfloordiv__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rfloordiv__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rfloordiv__(other); + } + + public PyObject __truediv__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__truediv__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__truediv__(other); + } + + public PyObject __rtruediv__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rtruediv__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rtruediv__(other); + } + + public PyObject __mod__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__mod__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__mod__(other); + } + + public PyObject __rmod__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rmod__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rmod__(other); + } + + public PyObject __divmod__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__divmod__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__divmod__(other); + } + + public PyObject __rdivmod__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rdivmod__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rdivmod__(other); + } + + public PyObject __pow__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__pow__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__pow__(other); + } + + public PyObject __rpow__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rpow__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rpow__(other); + } + + public PyObject __lshift__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__lshift__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__lshift__(other); + } + + public PyObject __rlshift__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rlshift__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rlshift__(other); + } + + public PyObject __rshift__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rshift__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rshift__(other); + } + + public PyObject __rrshift__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rrshift__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rrshift__(other); + } + + public PyObject __and__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__and__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__and__(other); + } + + public PyObject __rand__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rand__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rand__(other); + } + + public PyObject __or__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__or__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__or__(other); + } + + public PyObject __ror__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__ror__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__ror__(other); + } + + public PyObject __xor__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__xor__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__xor__(other); + } + + public PyObject __rxor__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__rxor__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__rxor__(other); + } + + public PyObject __lt__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__lt__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__lt__(other); + } + + public PyObject __le__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__le__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__le__(other); + } + + public PyObject __gt__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__gt__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__gt__(other); + } + + public PyObject __ge__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__ge__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__ge__(other); + } + + public PyObject __eq__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__eq__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__eq__(other); + } + + public PyObject __ne__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__ne__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res==Py.NotImplemented) + return null; + return res; + } + return super.__ne__(other); + } + + public PyObject __iadd__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__iadd__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(other); + return super.__iadd__(other); + } + + public PyObject __isub__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__isub__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(other); + return super.__isub__(other); + } + + public PyObject __imul__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__imul__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(other); + return super.__imul__(other); + } + + public PyObject __idiv__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__idiv__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(other); + return super.__idiv__(other); + } + + public PyObject __ifloordiv__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__ifloordiv__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(other); + return super.__ifloordiv__(other); + } + + public PyObject __itruediv__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__itruediv__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(other); + return super.__itruediv__(other); + } + + public PyObject __imod__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__imod__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(other); + return super.__imod__(other); + } + + public PyObject __ipow__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__ipow__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(other); + return super.__ipow__(other); + } + + public PyObject __ilshift__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__ilshift__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(other); + return super.__ilshift__(other); + } + + public PyObject __irshift__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__irshift__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(other); + return super.__irshift__(other); + } + + public PyObject __iand__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__iand__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(other); + return super.__iand__(other); + } + + public PyObject __ior__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__ior__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(other); + return super.__ior__(other); + } + + public PyObject __ixor__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__ixor__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(other); + return super.__ixor__(other); + } + + public String toString() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__repr__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (!(res instanceof PyString)) + throw Py.TypeError("__repr__ should return a string"); + return((PyString)res).toString(); + } + return super.toString(); + } + + public int hashCode() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__hash__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyInteger) + return((PyInteger)res).getValue(); + throw Py.TypeError("__hash__ should return a int"); + } + if (self_type.lookup("__eq__")!=null||self_type.lookup("__cmp__")!=null) + throw Py.TypeError("unhashable type"); + return super.hashCode(); + } + + public PyUnicode __unicode__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__unicode__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyUnicode) + return(PyUnicode)res; + if (res instanceof PyString) + return new PyUnicode((PyString)res); + throw Py.TypeError("__unicode__"+" should return a "+"unicode"); + } + return super.__unicode__(); + } + + public int __cmp__(PyObject other) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__cmp__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(other); + if (res instanceof PyInteger) { + int v=((PyInteger)res).getValue(); + return v<0?-1:v>0?1:0; + } + throw Py.TypeError("__cmp__ should return a int"); + } + return super.__cmp__(other); + } + + public boolean __nonzero__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__nonzero__"); + if (impl==null) { + impl=self_type.lookup("__len__"); + if (impl==null) + return super.__nonzero__(); + } + return impl.__get__(this,self_type).__call__().__nonzero__(); + } + + public boolean __contains__(PyObject o) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__contains__"); + if (impl==null) + return super.__contains__(o); + return impl.__get__(this,self_type).__call__(o).__nonzero__(); + } + + public int __len__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__len__"); + if (impl!=null) { + PyObject res=impl.__get__(this,self_type).__call__(); + if (res instanceof PyInteger) + return((PyInteger)res).getValue(); + throw Py.TypeError("__len__ should return a int"); + } + return super.__len__(); + } + + public PyObject __iter__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__iter__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(); + impl=self_type.lookup("__getitem__"); + if (impl==null) + return super.__iter__(); + return new PySequenceIter(this); + } + + public PyObject __iternext__() { + PyType self_type=getType(); + PyObject impl=self_type.lookup("next"); + if (impl!=null) { + try { + return impl.__get__(this,self_type).__call__(); + } catch (PyException exc) { + if (Py.matchException(exc,Py.StopIteration)) + return null; + throw exc; + } + } + return super.__iternext__(); // ??? + } + + public PyObject __finditem__(PyObject key) { // ??? + PyType self_type=getType(); + PyObject impl=self_type.lookup("__getitem__"); + if (impl!=null) + try { + return impl.__get__(this,self_type).__call__(key); + } catch (PyException exc) { + if (Py.matchException(exc,Py.LookupError)) + return null; + throw exc; + } + return super.__finditem__(key); + } + + public void __setitem__(PyObject key,PyObject value) { // ??? + PyType self_type=getType(); + PyObject impl=self_type.lookup("__setitem__"); + if (impl!=null) { + impl.__get__(this,self_type).__call__(key,value); + return; + } + super.__setitem__(key,value); + } + + public PyObject __getitem__(PyObject key) { // ??? + PyType self_type=getType(); + PyObject impl=self_type.lookup("__getitem__"); + if (impl!=null) { + try { + return impl.__get__(this,self_type).__call__(key); + } catch (PyException exc) { + if (Py.matchException(exc,Py.LookupError)) + return null; + throw exc; + } + } + return super.__getitem__(key); + } + + public PyObject __getslice__(PyObject start,PyObject stop,PyObject step) { // ??? + PyType self_type=getType(); + PyObject impl=self_type.lookup("__getslice__"); + if (impl!=null) + try { + return impl.__get__(this,self_type).__call__(start,stop); + } catch (PyException exc) { + if (Py.matchException(exc,Py.LookupError)) + return null; + throw exc; + } + return super.__getslice__(start,stop,step); + } + + public void __delitem__(PyObject key) { // ??? + PyType self_type=getType(); + PyObject impl=self_type.lookup("__delitem__"); + if (impl!=null) { + impl.__get__(this,self_type).__call__(key); + return; + } + super.__delitem__(key); + } + + public PyObject __call__(PyObject args[],String keywords[]) { + ThreadState ts=Py.getThreadState(); + if (ts.recursion_depth++>ts.systemState.getrecursionlimit()) + throw Py.RuntimeError("maximum __call__ recursion depth exceeded"); + try { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__call__"); + if (impl!=null) + return impl.__get__(this,self_type).__call__(args,keywords); + return super.__call__(args,keywords); + } finally { + --ts.recursion_depth; + } + } + + public PyObject __findattr__(String name) { + PyType self_type=getType(); + PyObject getattribute=self_type.lookup("__getattribute__"); + PyString py_name=null; + try { + if (getattribute!=null) { + return getattribute.__get__(this,self_type).__call__(py_name=new PyString(name)); + } else { + return super.__findattr__(name); + } + } catch (PyException e) { + if (Py.matchException(e,Py.AttributeError)) { + PyObject getattr=self_type.lookup("__getattr__"); + if (getattr!=null) + try { + return getattr.__get__(this,self_type).__call__(py_name!=null?py_name:new PyString(name)); + } catch (PyException e1) { + if (!Py.matchException(e1,Py.AttributeError)) + throw e1; + } + return null; + } + throw e; + } + } + + public void __setattr__(String name,PyObject value) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__setattr__"); + if (impl!=null) { + impl.__get__(this,self_type).__call__(new PyString(name),value); + return; + } + super.__setattr__(name,value); + } + + public void __delattr__(String name) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__delattr__"); + if (impl!=null) { + impl.__get__(this,self_type).__call__(new PyString(name)); + return; + } + super.__delattr__(name); + } + + public PyObject __get__(PyObject obj,PyObject type) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__get__"); + if (impl!=null) { + if (obj==null) + obj=Py.None; + if (type==null) + type=Py.None; + return impl.__get__(this,self_type).__call__(obj,type); + } + return super.__get__(obj,type); + } + + public void __set__(PyObject obj,PyObject value) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__set__"); + if (impl!=null) { + impl.__get__(this,self_type).__call__(obj,value); + return; + } + super.__set__(obj,value); + } + + public void __delete__(PyObject obj) { + PyType self_type=getType(); + PyObject impl=self_type.lookup("__delete__"); + if (impl!=null) { + impl.__get__(this,self_type).__call__(obj); + return; + } + super.__delete__(obj); + } + + public void dispatch__init__(PyType type,PyObject[]args,String[]keywords) { + PyType self_type=getType(); + if (self_type.isSubType(type)) { + PyObject impl=self_type.lookup("__init__"); + if (impl!=null) + impl.__get__(this,self_type).__call__(args,keywords); + } + } + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2006-06-25 03:34:47
|
Revision: 2828 Author: fwierzbicki Date: 2006-06-24 20:34:21 -0700 (Sat, 24 Jun 2006) ViewCVS: http://svn.sourceforge.net/jython/?rev=2828&view=rev Log Message: ----------- Merge from trunk. These required extra care since they make reference to the new bool type that will not be in 2.2. Modified Paths: -------------- branches/2.3/src/org/python/core/PyInteger.java branches/2.3/src/org/python/core/PyObject.java branches/2.3/src/org/python/core/PySystemState.java branches/2.3/src/org/python/core/__builtin__.java Modified: branches/2.3/src/org/python/core/PyInteger.java =================================================================== --- branches/2.3/src/org/python/core/PyInteger.java 2006-06-25 02:01:24 UTC (rev 2827) +++ branches/2.3/src/org/python/core/PyInteger.java 2006-06-25 03:34:21 UTC (rev 2828) @@ -1248,7 +1248,7 @@ } final String int_toString() { - return Integer.toString(value); + return Integer.toString(getValue()); } public int hashCode() { @@ -1256,7 +1256,7 @@ } final int int_hashCode() { - return value; + return getValue(); } private static void err_ovf(String msg) { @@ -1273,7 +1273,7 @@ } final boolean int___nonzero__() { - return value != 0; + return getValue() != 0; } public Object __tojava__(Class c) { @@ -1281,22 +1281,22 @@ c == Object.class || c == Integer.class || c == Serializable.class) { - return new Integer(value); + return new Integer(getValue()); } if (c == Boolean.TYPE || c == Boolean.class) - return new Boolean(value != 0); + return new Boolean(getValue() != 0); if (c == Byte.TYPE || c == Byte.class) - return new Byte((byte)value); + return new Byte((byte)getValue()); if (c == Short.TYPE || c == Short.class) - return new Short((short)value); + return new Short((short)getValue()); if (c == Long.TYPE || c == Long.class) - return new Long(value); + return new Long(getValue()); if (c == Float.TYPE || c == Float.class) - return new Float(value); + return new Float(getValue()); if (c == Double.TYPE || c == Double.class) - return new Double(value); + return new Double(getValue()); return super.__tojava__(c); } @@ -1308,7 +1308,7 @@ if (!canCoerce(other)) return -2; int v = coerce(other); - return value < v ? -1 : value > v ? 1 : 0; + return getValue() < v ? -1 : getValue() > v ? 1 : 0; } public Object __coerce_ex__(PyObject other) { @@ -1397,7 +1397,7 @@ double x = (double)getValue(); x *= rightv; - //long x = ((long)value)*((PyInteger)right).value; + //long x = ((long)getValue())*((PyInteger)right).getValue(); //System.out.println("mul: "+this+" * "+right+" = "+x); if (x <= Integer.MAX_VALUE && x >= Integer.MIN_VALUE) @@ -1542,8 +1542,8 @@ int v = getValue(); int xdivy = divide(v, rightv); return new PyTuple(new PyObject[] { - new PyInteger(xdivy), - new PyInteger(modulo(v, rightv, xdivy)) + Py.newInteger(xdivy), + Py.newInteger(modulo(v, rightv, xdivy)) }); } @@ -1648,10 +1648,10 @@ return null; if (rightv > 31) - return new PyInteger(0); + return Py.newInteger(0); else if(rightv < 0) throw Py.ValueError("negative shift count"); - return Py.newInteger(value << rightv); + return Py.newInteger(getValue() << rightv); } public PyObject __rshift__(PyObject right) { @@ -1668,7 +1668,7 @@ if(rightv < 0) throw Py.ValueError("negative shift count"); - return Py.newInteger(value >> rightv); + return Py.newInteger(getValue() >> rightv); } public PyObject __and__(PyObject right) { @@ -1688,11 +1688,11 @@ final PyObject int___xor__(PyObject right) { int rightv; if (right instanceof PyInteger) - rightv = ((PyInteger)right).value; + rightv = ((PyInteger)right).getValue(); else return null; - return Py.newInteger(value ^ rightv); + return Py.newInteger(getValue() ^ rightv); } public PyObject __or__(PyObject right) { @@ -1702,11 +1702,11 @@ final PyObject int___or__(PyObject right) { int rightv; if (right instanceof PyInteger) - rightv = ((PyInteger)right).value; + rightv = ((PyInteger)right).getValue(); else return null; - return Py.newInteger(value | rightv); + return Py.newInteger(getValue() | rightv); } public PyObject __neg__() { @@ -1714,8 +1714,8 @@ } final PyObject int___neg__() { - int x = -value; - if (value < 0 && x < 0) + int x = -getValue(); + if (getValue() < 0 && x < 0) err_ovf("integer negation"); return Py.newInteger(x); } @@ -1725,7 +1725,7 @@ } final PyObject int___pos__() { - return this; + return Py.newInteger(getValue()); } public PyObject __abs__() { @@ -1733,8 +1733,8 @@ } final PyObject int___abs__() { - if (value >= 0) - return this; + if (getValue() >= 0) + return Py.newInteger(getValue()); else return __neg__(); } @@ -1752,7 +1752,7 @@ } final PyInteger int___int__() { - return this; + return Py.newInteger(getValue()); } public PyLong __long__() { @@ -1760,7 +1760,7 @@ } final PyLong int___long__() { - return new PyLong(value); + return new PyLong(getValue()); } public PyFloat __float__() { @@ -1768,11 +1768,11 @@ } final PyFloat int___float__() { - return new PyFloat((double)value); + return new PyFloat((double)getValue()); } public PyComplex __complex__() { - return new PyComplex((double)value, 0.); + return new PyComplex((double)getValue(), 0.); } public PyString __oct__() { @@ -1780,11 +1780,11 @@ } final PyString int___oct__() { - if (value < 0) { + if (getValue() < 0) { return new PyString( - "0"+Long.toString(0x100000000l+(long)value, 8)); - } else if (value > 0) { - return new PyString("0"+Integer.toString(value, 8)); + "0"+Long.toString(0x100000000l+(long)getValue(), 8)); + } else if (getValue() > 0) { + return new PyString("0"+Integer.toString(getValue(), 8)); } else return new PyString("0"); } @@ -1794,11 +1794,11 @@ } final PyString int___hex__() { - if (value < 0) { + if (getValue() < 0) { return new PyString( - "0x"+Long.toString(0x100000000l+(long)value, 16)); + "0x"+Long.toString(0x100000000l+(long)getValue(), 16)); } else { - return new PyString("0x"+Integer.toString(value, 16)); + return new PyString("0x"+Integer.toString(getValue(), 16)); } } @@ -1826,7 +1826,7 @@ return new PyTuple(new PyObject[]{ getType(), new PyTuple(new PyObject[]{ - new PyInteger(getValue()) + Py.newInteger(getValue()) }) }); } Modified: branches/2.3/src/org/python/core/PyObject.java =================================================================== --- branches/2.3/src/org/python/core/PyObject.java 2006-06-25 02:01:24 UTC (rev 2827) +++ branches/2.3/src/org/python/core/PyObject.java 2006-06-25 03:34:21 UTC (rev 2828) @@ -401,11 +401,14 @@ } public PyObject getDoc() { - PyObject doc = fastGetDict().__finditem__("__doc__"); - if(doc == null) { - return Py.None; + PyObject d = fastGetDict(); + if (d != null) { + PyObject doc = d.__finditem__("__doc__"); + if(doc != null) { + return doc; + } } - return doc; + return Py.None; } public PyObject(PyType objtype) { @@ -2869,8 +2872,9 @@ descr.__set__(this, value); } - if (descr != null) + if (descr != null) { readonlyAttributeError(name); + } noAttributeError(name); } @@ -2905,8 +2909,9 @@ descr.__delete__(this); } - if (descr != null) + if (descr != null) { readonlyAttributeError(name); + } noAttributeError(name); } Modified: branches/2.3/src/org/python/core/PySystemState.java =================================================================== --- branches/2.3/src/org/python/core/PySystemState.java 2006-06-25 02:01:24 UTC (rev 2827) +++ branches/2.3/src/org/python/core/PySystemState.java 2006-06-25 03:34:21 UTC (rev 2828) @@ -332,7 +332,6 @@ ".jython"); addRegistryFile(homeFile); } catch (Exception exc) { - ; } } if (postProperties != null) { @@ -349,17 +348,20 @@ private static void addRegistryFile(File file) { if (file.exists()) { - registry = new Properties(registry); - try { - FileInputStream fp = new FileInputStream(file); + if (!file.isDirectory()) { + registry = new Properties(registry); try { - registry.load(fp); - } finally { - fp.close(); + FileInputStream fp = new FileInputStream(file); + try { + registry.load(fp); + } finally { + fp.close(); + } + } catch (IOException e) { + System.err.println("couldn't open registry file: " + file.toString()); } - } catch (IOException e) { - System.err.println("couldn't open registry file: " + - file.toString()); + } else { + System.err.println("warning: " + file.toString() + " is a directory, not a file"); } } } @@ -434,7 +436,7 @@ Py.Zero = new PyInteger(0); Py.One = new PyInteger(1); - + Py.False = new PyBoolean(false); Py.True = new PyBoolean(true); Modified: branches/2.3/src/org/python/core/__builtin__.java =================================================================== --- branches/2.3/src/org/python/core/__builtin__.java 2006-06-25 02:01:24 UTC (rev 2827) +++ branches/2.3/src/org/python/core/__builtin__.java 2006-06-25 03:34:21 UTC (rev 2828) @@ -423,6 +423,9 @@ if (ret != null) { return (PyString) ret; } + if (s instanceof PyStringDerived) { + s = s.__str__(); + } internedStrings.__setitem__(istring, s); return s; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <m_...@us...> - 2006-07-18 22:00:43
|
Revision: 2842 Author: m_small Date: 2006-07-18 15:00:38 -0700 (Tue, 18 Jul 2006) ViewCVS: http://svn.sourceforge.net/jython/?rev=2842&view=rev Log Message: ----------- Commit of Charlie (cgroves)'s codec fixes (patch 1516002). Modified Paths: -------------- branches/2.3/src/org/python/core/Py.java branches/2.3/src/org/python/core/PyString.java branches/2.3/src/org/python/core/codecs.java branches/2.3/src/org/python/core/exceptions.java branches/2.3/src/org/python/modules/_codecs.java Modified: branches/2.3/src/org/python/core/Py.java =================================================================== --- branches/2.3/src/org/python/core/Py.java 2006-07-18 18:47:28 UTC (rev 2841) +++ branches/2.3/src/org/python/core/Py.java 2006-07-18 22:00:38 UTC (rev 2842) @@ -229,6 +229,49 @@ return new PyException(Py.UnicodeError, message); } + public static PyObject UnicodeTranslateError; + public static PyException UnicodeTranslateError(String object, + int start, + int end, + String reason) { + return new PyException(Py.UnicodeTranslateError, + new PyTuple(new PyObject[] { + new PyString(object), + new PyInteger(start), + new PyInteger(end), + new PyString(reason)})); + } + + public static PyObject UnicodeDecodeError; + + public static PyException UnicodeDecodeError(String encoding, + String object, + int start, + int end, + String reason) { + return new PyException(Py.UnicodeDecodeError, + new PyTuple(new PyObject[] {new PyString(encoding), + new PyString(object), + new PyInteger(start), + new PyInteger(end), + new PyString(reason)})); + } + + public static PyObject UnicodeEncodeError; + + public static PyException UnicodeEncodeError(String encoding, + String object, + int start, + int end, + String reason) { + return new PyException(Py.UnicodeEncodeError, + new PyTuple(new PyObject[] {new PyString(encoding), + new PyString(object), + new PyInteger(start), + new PyInteger(end), + new PyString(reason)})); + } + public static PyObject EOFError; public static PyException EOFError(String message) { return new PyException(Py.EOFError, message); @@ -274,6 +317,11 @@ public static void DeprecationWarning(String message) { warning(DeprecationWarning, message); } + + public static PyObject PendingDeprecationWarning; + public static void PendingDeprecationWarning(String message) { + warning( PendingDeprecationWarning, message); + } public static PyObject SyntaxWarning; public static void SyntaxWarning(String message) { @@ -289,6 +337,11 @@ public static void RuntimeWarning(String message) { warning(RuntimeWarning, message); } + + public static PyObject FutureWarning; + public static void FutureWarning(String message) { + warning(FutureWarning, message); + } private static PyObject warnings_mod; private static PyObject importWarnings() { @@ -611,15 +664,20 @@ FloatingPointError = initExc("FloatingPointError", exc, dict); ValueError = initExc("ValueError", exc, dict); UnicodeError = initExc("UnicodeError", exc, dict); + UnicodeEncodeError = initExc("UnicodeEncodeError", exc, dict); + UnicodeDecodeError = initExc("UnicodeDecodeError", exc, dict); + UnicodeTranslateError = initExc("UnicodeTranslateError", exc, dict); ReferenceError = initExc("ReferenceError", exc, dict); SystemError = initExc("SystemError", exc, dict); MemoryError = initExc("MemoryError", exc, dict); Warning = initExc("Warning", exc, dict); UserWarning = initExc("UserWarning", exc, dict); DeprecationWarning = initExc("DeprecationWarning", exc, dict); + PendingDeprecationWarning = initExc("PendingDeprecationWarning", exc, dict); SyntaxWarning = initExc("SyntaxWarning", exc, dict); OverflowWarning = initExc("OverflowWarning", exc, dict); RuntimeWarning = initExc("RuntimeWarning", exc, dict); + FutureWarning = initExc("FutureWarning", exc, dict); } public static PySystemState defaultSystemState; Modified: branches/2.3/src/org/python/core/PyString.java =================================================================== --- branches/2.3/src/org/python/core/PyString.java 2006-07-18 18:47:28 UTC (rev 2841) +++ branches/2.3/src/org/python/core/PyString.java 2006-07-18 22:00:38 UTC (rev 2842) @@ -1614,7 +1614,7 @@ public PyObject __call__(PyObject arg0) { String result=self.str_join(arg0); //XXX: do we really need to check self? - if (self instanceof PyUnicode||arg0 instanceof PyUnicode) { + if (self instanceof PyUnicode||(arg0.__len__() > 0 && arg0.__getitem__(0) instanceof PyUnicode)) { return new PyUnicode(result); } else { return new PyString(result); @@ -1625,7 +1625,8 @@ PyString self=(PyString)gself; String result=self.str_join(arg0); //XXX: do we really need to check self? - if (self instanceof PyUnicode||arg0 instanceof PyUnicode) { + System.out.println("INST CALL"); + if (self instanceof PyUnicode||(arg0.__len__() > 0 && arg0.__getitem__(0) instanceof PyUnicode)) { return new PyUnicode(result); } else { return new PyString(result); @@ -2926,7 +2927,6 @@ StringBuffer v = new StringBuffer(str.length()); char quote = 0; - boolean unicode = false; if (use_quotes) { quote = str.indexOf('\'') >= 0 && @@ -2940,13 +2940,32 @@ if (use_quotes && (ch == quote || ch == '\\')) { v.append('\\'); v.append((char) ch); + continue; } + /* Map UTF-16 surrogate pairs to Unicode \UXXXXXXXX escapes */ + else if (ch >= 0xD800 && ch < 0xDC00) { + char ch2 = str.charAt(i++); + size--; + if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) { + int ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000; + v.append('\\'); + v.append('U'); + v.append(hexdigit[(ucs >> 28) & 0xf]); + v.append(hexdigit[(ucs >> 24) & 0xf]); + v.append(hexdigit[(ucs >> 20) & 0xf]); + v.append(hexdigit[(ucs >> 16) & 0xf]); + v.append(hexdigit[(ucs >> 12) & 0xf]); + v.append(hexdigit[(ucs >> 8) & 0xf]); + v.append(hexdigit[(ucs >> 4) & 0xf]); + v.append(hexdigit[ucs & 0xf]); + continue; + } + /* Fall through: isolated surrogates are copied as-is */ + i--; + size++; + } /* Map 16-bit characters to '\\uxxxx' */ - else if (ch >= 256) { - if (use_quotes && !unicode) { - v.insert(0, 'u'); - unicode = true; - } + if (ch >= 256) { v.append('\\'); v.append('u'); v.append(hexdigit[(ch >> 12) & 0xf]); @@ -2961,9 +2980,10 @@ else if (use_quotes && ch == '\f') v.append("\\f"); else if (use_quotes && ch == '\r') v.append("\\r"); else if (ch < ' ' || ch >= 127) { - v.append("\\x"); - v.append(hexdigit[(ch >> 4) & 0xF]); - v.append(hexdigit[ch & 0xF]); + v.append('\\'); + v.append('x'); + v.append(hexdigit[(ch >> 4) & 0xf]); + v.append(hexdigit[ch & 0xf]); } /* Copy everything else as-is */ else @@ -2976,177 +2996,265 @@ private static ucnhashAPI pucnHash = null; - public static String decode_UnicodeEscape(String str, int start, int end, - String errors, boolean unicode) - { - StringBuffer v = new StringBuffer(end-start); - for (int s = start; s < end; ) { + + public static String decode_UnicodeEscape(String str, + int start, + int end, + String errors, + boolean unicode) { + StringBuffer v = new StringBuffer(end - start); + for(int s = start; s < end;) { char ch = str.charAt(s); - /* Non-escape characters are interpreted as Unicode ordinals */ - if (ch != '\\') { + if(ch != '\\') { v.append(ch); s++; continue; } - + int loopStart = s; /* \ - Escapes */ s++; + if(s == end) { + s = codecs.insertReplacementAndGetResume(v, + errors, + "unicodeescape", + str, + loopStart, + s + 1, + "\\ at end of string"); + continue; + } ch = str.charAt(s++); - switch (ch) { - - /* \x escapes */ - case '\n': break; - case '\\': v.append('\\'); break; - case '\'': v.append('\''); break; - case '\"': v.append('\"'); break; - case 'b': v.append('\b'); break; - case 'f': v.append('\014'); break; /* FF */ - case 't': v.append('\t'); break; - case 'n': v.append('\n'); break; - case 'r': v.append('\r'); break; - case 'v': v.append('\013'); break; /* VT */ - case 'a': v.append('\007'); break; /* BEL, not classic C */ - - /* \OOO (octal) escapes */ - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - - int x = Character.digit(ch, 8); - for (int j = 0; j < 2 && s < end; j++, s++) { - ch = str.charAt(s); - if (ch < '0' || ch > '7') + switch(ch){ + /* \x escapes */ + case '\n': + break; + case '\\': + v.append('\\'); + break; + case '\'': + v.append('\''); + break; + case '\"': + v.append('\"'); + break; + case 'b': + v.append('\b'); + break; + case 'f': + v.append('\014'); + break; /* FF */ + case 't': + v.append('\t'); + break; + case 'n': + v.append('\n'); + break; + case 'r': + v.append('\r'); + break; + case 'v': + v.append('\013'); + break; /* VT */ + case 'a': + v.append('\007'); + break; /* BEL, not classic C */ + /* \OOO (octal) escapes */ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + int x = Character.digit(ch, 8); + for(int j = 0; j < 2 && s < end; j++, s++) { + ch = str.charAt(s); + if(ch < '0' || ch > '7') + break; + x = (x << 3) + Character.digit(ch, 8); + } + v.append((char)x); + break; + case 'x': + s = hexescape(v, errors, 2, s, str, end, "truncated \\xXX"); + break; + case 'u': + if(!unicode) { + v.append('\\'); + v.append('u'); break; - x = (x<<3) + Character.digit(ch, 8); - } - v.append((char) x); - break; - - case 'x': - int i; - for (x = 0, i = 0; i < 2 && s < end; i++) { - ch = str.charAt(s + i); - int d = Character.digit(ch, 16); - if (d == -1) { - codecs.decoding_error("unicode escape", v, errors, - "truncated \\xXX"); - i++; + } + s = hexescape(v, + errors, + 4, + s, + str, + end, + "truncated \\uXXXX"); + break; + case 'U': + if(!unicode) { + v.append('\\'); + v.append('U'); break; } - - x = ((x<<4) & ~0xF) + d; - } - s += i; - v.append((char) x); - break; - - /* \ uXXXX with 4 hex digits */ - case 'u': - if (!unicode) { - v.append('\\'); - v.append('u'); + s = hexescape(v, + errors, + 8, + s, + str, + end, + "truncated \\UXXXXXXXX"); break; - } - if (s+4 > end) { - codecs.decoding_error("unicode escape", v, errors, - "truncated \\uXXXX"); - break; - } - for (x = 0, i = 0; i < 4; i++) { - ch = str.charAt(s + i); - int d = Character.digit(ch, 16); - if (d == -1) { - codecs.decoding_error("unicode escape", v, errors, - "truncated \\uXXXX"); + case 'N': + if(!unicode) { + v.append('\\'); + v.append('N'); break; } - x = ((x<<4) & ~0xF) + d; - } - s += i; - v.append((char) x); - break; - - case 'N': - if (!unicode) { - v.append('\\'); - v.append('N'); - break; - } - /* Ok, we need to deal with Unicode Character Names now, - * make sure we've imported the hash table data... - */ - if (pucnHash == null) { - PyObject mod = imp.importName("ucnhash", true); - mod = mod.__call__(); - pucnHash = (ucnhashAPI) mod.__tojava__(Object.class); - if (pucnHash.getCchMax() < 0) - codecs.decoding_error("unicode escape", v, errors, - "Unicode names not loaded"); - } - - if (str.charAt(s) == '{') { - int startName = s + 1; - int endBrace = startName; - - /* look for either the closing brace, or we - * exceed the maximum length of the unicode - * character names + /* + * Ok, we need to deal with Unicode Character Names now, + * make sure we've imported the hash table data... */ - int maxLen = pucnHash.getCchMax(); - while (endBrace < end && str.charAt(endBrace) != '}' - && (endBrace - startName) <= maxLen) { - endBrace++; + if(pucnHash == null) { + PyObject mod = imp.importName("ucnhash", true); + mod = mod.__call__(); + pucnHash = (ucnhashAPI)mod.__tojava__(Object.class); + if(pucnHash.getCchMax() < 0) + throw Py.UnicodeError("Unicode names not loaded"); } - if (endBrace != end && str.charAt(endBrace) == '}') { - int value = pucnHash.getValue(str, startName, - endBrace); - if (value < 0) { - codecs.decoding_error("unicode escape", v, - errors, "Invalid Unicode Character Name"); - v.append('\\'); - v.append(str.charAt(s-1)); - break; - } - - if (value < 1<<16) { - /* In UCS-2 range, easy solution.. */ - v.append((char) value); - } else { - /* Oops, its in UCS-4 space, */ - /* compute and append the two surrogates: */ - /* translate from 10000..10FFFF to 0..FFFFF */ - value -= 0x10000; - - /* high surrogate = top 10 bits added to D800 */ - v.append((char) (0xD800 + (value >> 10))); - - /* low surrogate = bottom 10 bits added to DC00*/ - v.append((char) (0xDC00 + (value & ~0xFC00))); + if(str.charAt(s) == '{') { + int startName = s + 1; + int endBrace = startName; + /* + * look for either the closing brace, or we exceed the + * maximum length of the unicode character names + */ + int maxLen = pucnHash.getCchMax(); + while(endBrace < end && str.charAt(endBrace) != '}' + && (endBrace - startName) <= maxLen) { + endBrace++; } - s = endBrace + 1; + if(endBrace != end && str.charAt(endBrace) == '}') { + int value = pucnHash.getValue(str, + startName, + endBrace); + if(storeUnicodeCharacter(value, v)) { + s = endBrace + 1; + } else { + s = codecs.insertReplacementAndGetResume(v, + errors, + "unicodeescape", + str, + loopStart, + endBrace + 1, + "illegal Unicode character"); + } + } else { + s = codecs.insertReplacementAndGetResume(v, + errors, + "unicodeescape", + str, + loopStart, + endBrace, + "malformed \\N character escape"); + } + break; } else { - codecs.decoding_error("unicode escape", v, errors, - "Unicode name missing closing brace"); - v.append('\\'); - v.append(str.charAt(s-1)); - break; + s = codecs.insertReplacementAndGetResume(v, + errors, + "unicodeescape", + str, + loopStart, + s + 1, + "malformed \\N character escape"); } break; - } - codecs.decoding_error("unicode escape", v, errors, - "Missing opening brace for Unicode " + - "Character Name escape"); + default: + v.append('\\'); + v.append(str.charAt(s - 1)); + break; + } + } + return v.toString(); + } - /* fall through on purpose */ - default: - v.append('\\'); - v.append(str.charAt(s-1)); - break; - } - } - return v.toString(); + private static int hexescape(StringBuffer partialDecode, + String errors, + int digits, + int hexDigitStart, + String str, + int size, + String errorMessage) { + if(hexDigitStart + digits > size) { + return codecs.insertReplacementAndGetResume(partialDecode, + errors, + "unicodeescape", + str, + hexDigitStart - 2, + size, + errorMessage); + } + int i = 0; + int x = 0; + for(; i < digits; ++i) { + char c = str.charAt(hexDigitStart + i); + int d = Character.digit(c, 16); + if(d == -1) { + return codecs.insertReplacementAndGetResume(partialDecode, + errors, + "unicodeescape", + str, + hexDigitStart - 2, + hexDigitStart + i + 1, + errorMessage); + } + x = (x << 4) & ~0xF; + if(c >= '0' && c <= '9') + x += c - '0'; + else if(c >= 'a' && c <= 'f') + x += 10 + c - 'a'; + else + x += 10 + c - 'A'; + } + if(storeUnicodeCharacter(x, partialDecode)) { + return hexDigitStart + i; + } else { + return codecs.insertReplacementAndGetResume(partialDecode, + errors, + "unicodeescape", + str, + hexDigitStart - 2, + hexDigitStart + i + 1, + "illegal Unicode character"); + } } + /*pass in an int since this can be a UCS-4 character */ + private static boolean storeUnicodeCharacter(int value, + StringBuffer partialDecode) { + if(value < 0) { + return false; + } else if(value < 1 << 16) { + /* In UCS-2 range, easy solution.. */ + partialDecode.append((char)value); + return true; + } else if(value <= 0x10ffff) { + /* Oops, its in UCS-4 space, */ + /* compute and append the two surrogates: */ + /* translate from 10000..10FFFF to 0..FFFFF */ + value -= 0x10000; + /* high surrogate = top 10 bits added to D800 */ + partialDecode.append((char)(0xD800 + (value >> 10))); + /* low surrogate = bottom 10 bits added to DC00 */ + partialDecode.append((char)(0xDC00 + (value & ~0xFC00))); + return true; + } + return false; + } + public boolean equals(Object other) { if (!(other instanceof PyString)) return false; @@ -3306,7 +3414,11 @@ for (int i=0; i<count; i++) { string.getChars(0, s, new_chars, i*s); } - return new PyString(new String(new_chars)); + if (this instanceof PyUnicode) { + return new PyUnicode(new String(new_chars)); + } else { + return new PyString(new String(new_chars)); + } } final PyObject str___mul__(PyObject o) { @@ -4871,6 +4983,11 @@ } public String formatLong(PyString arg, char type, boolean altFlag) { + if(precision > 250){ + // A magic number. Larger than in CPython. + throw Py.OverflowError( + "formatted long is too long (precision too long?)"); + } String s = arg.toString(); int end = s.length(); int ptr = 0; @@ -4928,6 +5045,11 @@ } public String formatInteger(long v, int radix, boolean unsigned) { + if(precision > 250){ + // A magic number. Larger than in CPython. + throw Py.OverflowError( + "formatted integer is too long (precision too long?)"); + } if (unsigned) { if (v < 0) v = 0x100000000l + v; @@ -4949,6 +5071,11 @@ } public String formatFloatDecimal(double v, boolean truncate) { + if(precision > 250) { + // A magic number. Larger than in CPython. + throw Py.OverflowError( + "formatted float is too long (precision too long?)"); + } java.text.NumberFormat format = java.text.NumberFormat.getInstance( java.util.Locale.US); int prec = precision; @@ -5087,11 +5214,6 @@ precision = getNumber(); if (precision < -1) precision = 0; - if (precision > 250) { - // A magic number. Larger than in CPython. - throw Py.OverflowError( - "formatted float is too long (precision too long?)"); - } c = pop(); } @@ -5111,7 +5233,6 @@ fill = '0'; else fill = ' '; - switch(c) { case 's': case 'r': Modified: branches/2.3/src/org/python/core/codecs.java =================================================================== --- branches/2.3/src/org/python/core/codecs.java 2006-07-18 18:47:28 UTC (rev 2841) +++ branches/2.3/src/org/python/core/codecs.java 2006-07-18 22:00:38 UTC (rev 2842) @@ -8,16 +8,29 @@ package org.python.core; + + /** * Contains the implementation of the builtin codecs. * @since Jython 2.0 */ public class codecs { + + + public static final String BACKSLASHREPLACE = "backslashreplace"; + + public static final String IGNORE = "ignore"; + + public static final String REPLACE = "replace"; + + public static final String XMLCHARREFREPLACE = "xmlcharrefreplace"; + private static char Py_UNICODE_REPLACEMENT_CHARACTER = 0xFFFD; - private static PyList searchPath = new PyList(); - private static PyStringMap searchCache = new PyStringMap(); + private static PyList searchPath; + private static PyStringMap searchCache; + private static PyStringMap errorHandlers; private static String default_encoding = "ascii"; @@ -29,8 +42,30 @@ lookup(encoding); default_encoding = encoding; } + + public static PyObject lookup_error(String handlerName){ + registry_init(); + if(handlerName == null){ + handlerName = "strict"; + } + PyObject handler = (PyObject)errorHandlers.__finditem__(handlerName.intern()); + if(handler == null){ + throw new PyException(Py.LookupError, + "unknown error handler name '" + handlerName + "'"); + } + return handler; + } + + public static void register_error(String name, PyObject error){ + registry_init(); + if (!error.isCallable()) { + throw Py.TypeError("argument must be callable"); + } + errorHandlers.__setitem__(name.intern(), error); + } public static void register(PyObject search_function) { + registry_init(); if (!search_function.isCallable()) { throw Py.TypeError("argument must be callable"); } @@ -39,7 +74,7 @@ public static PyTuple lookup(String encoding) { - import_encodings(); + registry_init(); PyString v = new PyString(normalizestring(encoding)); PyObject result = searchCache.__finditem__(v); if (result != null) { @@ -108,15 +143,7 @@ errors = errors.intern(); } - /* Shortcuts for common default encodings */ -/* - if (encoding.equals("utf-8")) - return utf_8_decode(v, errors).__getitem__(0).__str__(); - else if (encoding.equals("latin-1")) - ; //return PyUnicode_DecodeLatin1(s, size, errors); - else if (encoding.equals("ascii")) - ; //return PyUnicode_DecodeASCII(s, size, errors); -*/ + /* Shortcut for ascii encoding */ if (encoding.equals("ascii")) { return PyUnicode_DecodeASCII(v.toString(), v.__len__(), errors); @@ -159,16 +186,12 @@ errors = errors.intern(); } - /* Shortcuts for common default encodings */ -/* - if (encoding.equals("utf-8")) - return PyUnicode_DecodeUTF8(v.toString(), v.__len__(), errors); - else if (encoding.equals("latin-1")) - return PyUnicode_DecodeLatin1(v.toString(), v.__len__(), errors); - else -*/ + /* Shortcuts for common default encodings. latin-1 must not use the + * lookup registry for the encodigs module to work correctly */ + if (encoding.equals("latin-1")){ + return PyUnicode_EncodeLatin1(v.toString(), v.__len__(), errors); - if (encoding.equals("ascii")) { + }else if (encoding.equals("ascii")) { return PyUnicode_EncodeASCII(v.toString(), v.__len__(), errors); } @@ -193,8 +216,465 @@ PyObject codecs = lookup(encoding); return codecs.__getitem__(0); } + + public static PyObject strict_errors(PyObject[] args, String[] kws){ + ArgParser ap = new ArgParser("strict_errors", args, kws, "exc"); + PyObject exc = ap.getPyObject(0); + if(Py.isInstance(exc, Py.UnicodeDecodeError)){ + throw new PyException(Py.UnicodeDecodeError, exc); + }else if(Py.isInstance(exc, Py.UnicodeEncodeError)){ + throw new PyException(Py.UnicodeEncodeError, exc); + }else if(Py.isInstance(exc, Py.UnicodeTranslateError)){ + throw new PyException(Py.UnicodeTranslateError, exc); + } + throw wrong_exception_type(exc); + } + + public static PyObject ignore_errors(PyObject[] args, String[] kws){ + ArgParser ap = new ArgParser("ignore_errors", args, kws, "exc"); + PyObject exc = ap.getPyObject(0); + if(!isUnicodeError(exc)){ + throw wrong_exception_type(exc); + } + PyObject end = exc.__getattr__("end"); + return new PyTuple(new PyObject[]{Py.java2py(""), end}); + } + private static boolean isUnicodeError(PyObject exc) { + return Py.isInstance(exc, Py.UnicodeDecodeError) || + Py.isInstance(exc, Py.UnicodeEncodeError) || + Py.isInstance(exc, Py.UnicodeTranslateError); + } + + public static PyObject replace_errors(PyObject[] args, String[] kws){ + ArgParser ap = new ArgParser("replace_errors", args, kws, "exc"); + PyObject exc = ap.getPyObject(0); + if(Py.isInstance(exc, Py.UnicodeDecodeError)){ + PyObject end = exc.__getattr__("end"); + return new PyTuple(new PyObject[]{new PyUnicode(Py_UNICODE_REPLACEMENT_CHARACTER), end}); + }else if(Py.isInstance(exc, Py.UnicodeEncodeError)){ + PyObject end = exc.__getattr__("end"); + return new PyTuple(new PyObject[]{Py.java2py("?"), end}); + }else if(Py.isInstance(exc, Py.UnicodeTranslateError)){ + PyObject end = exc.__getattr__("end"); + return new PyTuple(new PyObject[]{new PyUnicode(Py_UNICODE_REPLACEMENT_CHARACTER), end}); + } + throw wrong_exception_type(exc); + } + + public static PyObject xmlcharrefreplace_errors(PyObject[] args, String[] kws){ + ArgParser ap = new ArgParser("xmlcharrefreplace_errors", args, kws, "exc"); + PyObject exc = ap.getPyObject(0); + if(!Py.isInstance(exc, Py.UnicodeEncodeError)){ + throw wrong_exception_type(exc); + } + int start = ((PyInteger)exc.__getattr__("start")).getValue(); + int end = ((PyInteger)exc.__getattr__("end")).getValue(); + String object = exc.__getattr__("object").toString(); + StringBuffer replacement = new StringBuffer(); + xmlcharrefreplace_internal(start, end, object, replacement); + return new PyTuple(new PyObject[]{Py.java2py(replacement.toString()), exc.__getattr__("end")}); + } + + public static StringBuffer xmlcharrefreplace(int start, int end, String toReplace){ + StringBuffer replacement = new StringBuffer(); + xmlcharrefreplace_internal(start, end, toReplace, replacement); + return replacement; + } + private static void xmlcharrefreplace_internal(int start, int end, String object, StringBuffer replacement) { + for(int i = start; i < end; i++) { + replacement.append("&#"); + char cur = object.charAt(i); + int digits; + int base; + if(cur < 10) { + digits = 1; + base = 1; + } else if(cur < 100) { + digits = 2; + base = 10; + } else if(cur < 1000) { + digits = 3; + base = 100; + } else if(cur < 10000) { + digits = 4; + base = 1000; + } else if(cur < 100000) { + digits = 5; + base = 10000; + } else if(cur < 1000000) { + digits = 6; + base = 100000; + } else { + digits = 7; + base = 1000000; + } + while(digits-- > 0) { + replacement.append((char)('0' + cur / base)); + cur %= base; + base /= 10; + } + replacement.append(';'); + } + } + + private static PyException wrong_exception_type(PyObject exc) { + PyObject excClass = exc.__getattr__("__class__"); + PyObject className = excClass.__getattr__("__name__"); + return new PyException(Py.TypeError, "Don't know how to handle " + + className + " in error callback"); + } + + + static char hexdigits[] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' + }; + + public static PyObject backslashreplace_errors(PyObject[] args, String[] kws){ + ArgParser ap = new ArgParser("backslashreplace_errors", args, kws, "exc"); + PyObject exc = ap.getPyObject(0); + if(!Py.isInstance(exc, Py.UnicodeEncodeError)){ + throw wrong_exception_type(exc); + } + int start = ((PyInteger)exc.__getattr__("start")).getValue(); + int end = ((PyInteger)exc.__getattr__("end")).getValue(); + String object = exc.__getattr__("object").toString(); + StringBuffer replacement = new StringBuffer(); + backslashreplace_internal(start, end, object, replacement); + return new PyTuple(new PyObject[]{Py.java2py(replacement.toString()), exc.__getattr__("end")}); + } + + public static StringBuffer backslashreplace(int start, int end, String toReplace){ + StringBuffer replacement = new StringBuffer(); + backslashreplace_internal(start, end, toReplace, replacement); + return replacement; + } + + private static void backslashreplace_internal(int start, int end, String object, StringBuffer replacement) { + for(int i = start; i < end; i++) { + replacement.append('\\'); + char c = object.charAt(i); + if(c >= 0x00010000) { + replacement.append('U'); + replacement.append(hexdigits[(c >> 28) & 0xf]); + replacement.append(hexdigits[(c >> 24) & 0xf]); + replacement.append(hexdigits[(c >> 20) & 0xf]); + replacement.append(hexdigits[(c >> 16) & 0xf]); + replacement.append(hexdigits[(c >> 12) & 0xf]); + replacement.append(hexdigits[(c >> 8) & 0xf]); + } else if(c >= 0x100) { + replacement.append('u'); + replacement.append(hexdigits[(c >> 12) & 0xf]); + replacement.append(hexdigits[(c >> 8) & 0xf]); + } else + replacement.append('x'); + replacement.append(hexdigits[(c >> 4) & 0xf]); + replacement.append(hexdigits[c & 0xf]); + } + } + + private static void registry_init(){ + if(searchPath != null) + return; + searchPath = new PyList(); + searchCache = new PyStringMap(); + errorHandlers = new PyStringMap(); + String[] builtinErrorHandlers = new String[] {"strict", + IGNORE, + REPLACE, + XMLCHARREFREPLACE, + BACKSLASHREPLACE}; + for(int i = 0; i < builtinErrorHandlers.length; i++) { + register_error(builtinErrorHandlers[i], + Py.newJavaFunc(codecs.class, builtinErrorHandlers[i] + + "_errors")); + } + import_encodings(); + } + /* --- UTF-7 Codec -------------------------------------------------------- */ + + /* see RFC2152 for details */ + + + public static + char utf7_special[] = { + /* + * indicate whether a UTF-7 character is special i.e. cannot be directly + * encoded: 0 - not special 1 - special 2 - whitespace (optional) 3 - + * RFC2152 Set O (optional) + */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 3, 3, 3, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 1, 1, + + }; + + private static boolean SPECIAL(char c, boolean encodeO, boolean encodeWS){ + return (c>127 || utf7_special[(c)] == 1) || + (encodeWS && (utf7_special[(c)] == 2)) || + (encodeO && (utf7_special[(c)] == 3)); + } + + private static final String B64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + private static char B64(int n){ + return B64_CHARS.charAt(n & 0x3f); + } + + private static boolean B64CHAR(char c) { + return B64_CHARS.indexOf(c) != -1; + } + + private static int UB64(char c) { + return ((c) == '+' ? 62 : (c) == '/' ? 63 : (c) >= 'a' ? + (c) - 71 : (c) >= 'A' ? (c) - 65 : (c) + 4); + } + + public static String PyUnicode_DecodeUTF7(String str, + String errors) { + int s = 0; + int e = str.length(); + boolean inShift = false; + int bitsInCharsleft = 0; + long charsleft = 0; + boolean surrogate = false; + char highOrderSurrogate = 0; + StringBuffer unicode = new StringBuffer(e); + while(s < e) { + // restart: + char ch = str.charAt(s); + if(inShift) { + if((ch == '-') || !B64CHAR(ch)) { + inShift = false; + s++; + while(bitsInCharsleft >= 16) { + bitsInCharsleft -= 16; + char outCh = (char)((charsleft >> bitsInCharsleft) & 0xffff); + if(surrogate) { + if(0xD800 <= outCh && outCh <= 0xDBFF) { + unicode.append(highOrderSurrogate); + unicode.append(outCh); + } else { + s = codecs.insertReplacementAndGetResume(unicode, + errors, + "utf-16", + str, + s, + s + 1, + "illegal UTF-16 surrogate"); + } + surrogate = false; + } else if(0xDC00 <= outCh && outCh <= 0xDFFF) { + surrogate = true; + highOrderSurrogate = outCh; + } else { + unicode.append(outCh); + } + } + if(bitsInCharsleft >= 6) { + /* + * The shift sequence has a partial character in it. If + * bitsleft < 6 then we could just classify it as + * padding but that is not the case here + */ + s = insertReplacementAndGetResume(unicode, + errors, + "utf-7", + str, + s, + s + 1, + "partial character in shift sequence"); + } + /* + * According to RFC2152 the remaining bits should be zero. + * We choose to signal an error/insert a replacement + * character here so indicate the potential of a misencoded + * character. + */ + if(bitsInCharsleft > 0 && ((charsleft << 5 - bitsInCharsleft) & 0x1f) > 0){ + s = insertReplacementAndGetResume(unicode, + errors, + "utf-7", + str, + s, + s + 1, + "non-zero padding bits in shift sequence"); + } + if(ch == '-') { + if((s < e) && (str.charAt(s) == '-')) { + unicode.append('-'); + inShift = true; + } + } else if(SPECIAL(ch, false, false)) { + s = insertReplacementAndGetResume(unicode, + errors, + "utf-7", + str, + s, + s + 1, + "unexpected special character"); + } else { + unicode.append(ch); + } + } else { + charsleft = (charsleft << 6) | UB64(ch); + bitsInCharsleft += 6; + s++; + while(bitsInCharsleft >= 16) { + bitsInCharsleft -= 16; + char outCh = (char)((charsleft >> bitsInCharsleft) & 0xffff); + if(surrogate) { + if(0xD800 <= outCh && outCh <= 0xDBFF) { + unicode.append(highOrderSurrogate); + unicode.append(outCh); + } else { + s = codecs.insertReplacementAndGetResume(unicode, + errors, + "utf-16", + str, + s, + s + 1, + "illegal UTF-16 surrogate"); + } + surrogate = false; + } else if(0xDC00 <= outCh && outCh <= 0xDFFF) { + surrogate = true; + highOrderSurrogate = outCh; + } else { + unicode.append(outCh); + } + } + } + } else if(ch == '+') { + s++; + if(s < e && str.charAt(s) == '-') { + s++; + unicode.append('+'); + } else { + inShift = true; + bitsInCharsleft = 0; + } + } else if(SPECIAL(ch, false, false)) { + s = insertReplacementAndGetResume(unicode, + errors, + "utf-7", + str, + s, + s + 1, + "unexpected special character"); + } else { + unicode.append(ch); + s++; + } + if(inShift && s == e) { + s = insertReplacementAndGetResume(unicode, + errors, + "utf-7", + str, + s, + s, + "unterminated shift sequence"); + } + } + return unicode.toString(); + } + + + public static String PyUnicode_EncodeUTF7(String str, + boolean encodeSetO, + boolean encodeWhiteSpace, + String errors) + { + int size = str.length(); + + if (size == 0) + return ""; + boolean inShift = false; + int bitsleft = 0; + int charsleft = 0; + + StringBuffer v = new StringBuffer(); + + for (int i = 0;i < size; ++i) { + char ch = str.charAt(i); + + if (!inShift) { + if (ch == '+') { + v.append('+'); + v.append('-'); + } else if (SPECIAL(ch, encodeSetO, encodeWhiteSpace)) { + charsleft = ch; + bitsleft = 16; + v.append('+'); + while (bitsleft >= 6) { + v.append(B64(charsleft >> (bitsleft-6))); + bitsleft -= 6; + } + inShift = bitsleft > 0; + } else { + v.append((char) ch); + } + } else { + if (!SPECIAL(ch, encodeSetO, encodeWhiteSpace)) { + v.append(B64(charsleft << (6-bitsleft))); + charsleft = 0; + bitsleft = 0; + /* Characters not in the BASE64 set implicitly unshift the sequence + so no '-' is required, except if the character is itself a '-' */ + if (B64CHAR(ch) || ch == '-') { + v.append('-'); + } + inShift = false; + v.append( ch); + } else { + bitsleft += 16; + charsleft = (charsleft << 16) | ch; + while (bitsleft >= 6) { + v.append(B64(charsleft >> (bitsleft-6))); + bitsleft -= 6; + } + /* If the next character is special then we dont' need to terminate + the shift sequence. If the next character is not a BASE64 character + or '-' then the shift sequence will be terminated implicitly and we + don't have to insert a '-'. */ + + if (bitsleft == 0) { + if (i + 1 < size) { + char ch2 = str.charAt(i+1); + + if (SPECIAL(ch2, encodeSetO, encodeWhiteSpace)) { + + } else if (B64CHAR(ch2) || ch2 == '-') { + v.append('-'); + inShift = false; + } else { + inShift = false; + } + + } + else { + v.append('-'); + inShift = false; + } + } + } + } + } + if (bitsleft > 0) { + v.append(B64(charsleft << (6-bitsleft))); + v.append('-'); + } + return v.toString(); + } + + /* --- UTF-8 Codec ---------------------------------------------------- */ private static byte utf8_code_length[] = { /* Map UTF-8 encoded prefix byte to sequence length. zero means @@ -225,53 +705,41 @@ /* Unpack UTF-8 encoded data */ for (int i = 0; i < size; ) { int ch = str.charAt(i); - if (ch > 0xFF) { - codecs.decoding_error("utf-8", unicode, errors, - "ordinal not in range(255)"); - i++; - continue; - } if (ch < 0x80) { unicode.append((char) ch); i++; continue; } + if (ch > 0xFF) { + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 1, "ordinal not in range(255)"); + continue; + } int n = utf8_code_length[ch]; if (i + n > size) { - codecs.decoding_error("utf-8", unicode, errors, - "unexpected end of data"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 1, "unexpected end of data"); continue; } switch (n) { case 0: - codecs.decoding_error("utf-8", unicode, errors, - "unexpected code byte"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 1, "unexpected code byte"); continue; case 1: - codecs.decoding_error("utf-8", unicode, errors, - "internal error"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 1, "internal error"); continue; case 2: char ch1 = str.charAt(i+1); if ((ch1 & 0xc0) != 0x80) { - codecs.decoding_error("utf-8", unicode, errors, - "invalid data"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 2, "invalid data"); continue; } ch = ((ch & 0x1f) << 6) + (ch1 & 0x3f); if (ch < 0x80) { - codecs.decoding_error("utf-8", unicode, errors, - "illegal encoding"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 2, "illegal encoding"); continue; } else unicode.append((char) ch); @@ -281,16 +749,12 @@ ch1 = str.charAt(i+1); char ch2 = str.charAt(i+2); if ((ch1 & 0xc0) != 0x80 || (ch2 & 0xc0) != 0x80) { - codecs.decoding_error("utf-8", unicode, errors, - "invalid data"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 3, "invalid data"); continue; } ch = ((ch & 0x0f) << 12) + ((ch1 & 0x3f) << 6) + (ch2 & 0x3f); if (ch < 0x800 || (ch >= 0xd800 && ch < 0xe000)) { - codecs.decoding_error("utf-8", unicode, errors, - "illegal encoding"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 3, "illegal encoding"); continue; } else unicode.append((char) ch); @@ -303,9 +767,7 @@ if ((ch1 & 0xc0) != 0x80 || (ch2 & 0xc0) != 0x80 || (ch3 & 0xc0) != 0x80) { - codecs.decoding_error("utf-8", unicode, errors, - "invalid data"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 4, "invalid data"); continue; } ch = ((ch & 0x7) << 18) + ((ch1 & 0x3f) << 12) + @@ -315,9 +777,7 @@ byte encoding */ (ch > 0x10ffff)) { /* maximum value allowed for UTF-16 */ - codecs.decoding_error("utf-8", unicode, errors, - "illegal encoding"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 4, "illegal encoding"); continue; } /* compute and append the two surrogates: */ @@ -334,9 +794,8 @@ default: /* Other sizes are only needed for UCS-4 */ - codecs.decoding_error("utf-8", unicode, errors, - "unsupported Unicode code range"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + n, "unsupported Unicode code range"); + continue; } i += n; } @@ -380,22 +839,33 @@ } - - /* --- 7-bit ASCII Codec -------------------------------------------- */ - public static String PyUnicode_DecodeASCII(String str, int size, String errors) { + return PyUnicode_DecodeIntLimited(str, size, errors, "ascii", 128); + } + + public static String PyUnicode_DecodeLatin1(String str, int size, + ... [truncated message content] |
From: <m_...@us...> - 2006-07-21 00:56:36
|
Revision: 2854 Author: m_small Date: 2006-07-20 17:56:31 -0700 (Thu, 20 Jul 2006) ViewCVS: http://svn.sourceforge.net/jython/?rev=2854&view=rev Log Message: ----------- cleanup: remove flags other than HEAPTYPE (partial undo of 2853) Modified Paths: -------------- branches/2.3/src/org/python/core/Py.java branches/2.3/src/org/python/core/PySystemState.java branches/2.3/src/org/python/core/PyType.java Modified: branches/2.3/src/org/python/core/Py.java =================================================================== --- branches/2.3/src/org/python/core/Py.java 2006-07-20 21:34:24 UTC (rev 2853) +++ branches/2.3/src/org/python/core/Py.java 2006-07-21 00:56:31 UTC (rev 2854) @@ -76,59 +76,9 @@ /** A Python string containing ' ' **/ public static PyString Space; - /** PyBufferProcs contains bf_getcharbuffer */ - public static long TPFLAGS_HAVE_GETCHARBUFFER; - - /** PySequenceMethods contains sq_contains */ - public static long TPFLAGS_HAVE_SEQUENCE_IN; - - /** This is here for backwards compatibility. Extensions that use the old - * GC API will still compile but the objects will not be tracked by the - * GC. */ - public static long TPFLAGS_GC; - - /** PySequenceMethods and PyNumberMethods contain in-place operators */ - public static long TPFLAGS_HAVE_INPLACEOPS; - - /** PyNumberMethods do their own coercion */ - public static long TPFLAGS_CHECKTYPES; - - /** tp_richcompare is defined */ - public static long TPFLAGS_HAVE_RICHCOMPARE; - - /** Objects which are weakly referencable if their tp_weaklistoffset is - * >0 - */ - public static long TPFLAGS_HAVE_WEAKREFS; - - /** tp_iter is defined */ - public static long TPFLAGS_HAVE_ITER; - - /** New members introduced by Python 2.2 exist */ - public static long TPFLAGS_HAVE_CLASS; - /** Set if the type object is dynamically allocated */ public static long TPFLAGS_HEAPTYPE; - /** Set if the type allows subclassing */ - public static long TPFLAGS_BASETYPE; - - /** Set if the type is 'ready' -- fully initialized */ - public static long TPFLAGS_READY; - - /** Set while the type is being 'readied', to prevent recursive ready calls - */ - public static long TPFLAGS_READYING; - - /** Objects support garbage collection (see objimp.h) */ - public static long TPFLAGS_HAVE_GC; - - /** These two bits are preserved for Stackless Python, next after this is - * 16 */ - public static long TPFLAGS_HAVE_STACKLESS_EXTENSION; - - public static long TPFLAGS_DEFAULT; - /** A unique object to indicate no conversion is possible in __tojava__ methods **/ public static Object NoConversion; Modified: branches/2.3/src/org/python/core/PySystemState.java =================================================================== --- branches/2.3/src/org/python/core/PySystemState.java 2006-07-20 21:34:24 UTC (rev 2853) +++ branches/2.3/src/org/python/core/PySystemState.java 2006-07-21 00:56:31 UTC (rev 2854) @@ -444,32 +444,8 @@ Py.Newline = new PyString("\n"); Py.Space = new PyString(" "); - Py.TPFLAGS_HAVE_GETCHARBUFFER = (1L<<0); - Py.TPFLAGS_HAVE_SEQUENCE_IN = (1L<<1); - Py.TPFLAGS_GC = 0; /* used to be (1L<<2) */ - Py.TPFLAGS_HAVE_INPLACEOPS = (1L<<3); - Py.TPFLAGS_CHECKTYPES = (1L<<4); - Py.TPFLAGS_HAVE_RICHCOMPARE = (1L<<5); - Py.TPFLAGS_HAVE_WEAKREFS = (1L<<6); - Py.TPFLAGS_HAVE_ITER = (1L<<7); - Py.TPFLAGS_HAVE_CLASS = (1L<<8); Py.TPFLAGS_HEAPTYPE = (1L<<9); - Py.TPFLAGS_BASETYPE = (1L<<10); - Py.TPFLAGS_READY = (1L<<12); - Py.TPFLAGS_READYING = (1L<<13); - Py.TPFLAGS_HAVE_GC = (1L<<14); - Py.TPFLAGS_HAVE_STACKLESS_EXTENSION = 0; /* if stackless, then (3L<<15); */ - Py.TPFLAGS_DEFAULT = ( Py.TPFLAGS_HAVE_GETCHARBUFFER | - Py.TPFLAGS_HAVE_SEQUENCE_IN | - Py.TPFLAGS_HAVE_INPLACEOPS | - Py.TPFLAGS_HAVE_RICHCOMPARE | - Py.TPFLAGS_HAVE_WEAKREFS | - Py.TPFLAGS_HAVE_ITER | - Py.TPFLAGS_HAVE_CLASS | - Py.TPFLAGS_HAVE_STACKLESS_EXTENSION | - 0); - // xxx what to do about modules __builtin__class = PyJavaClass.lookup(__builtin__.class); Modified: branches/2.3/src/org/python/core/PyType.java =================================================================== --- branches/2.3/src/org/python/core/PyType.java 2006-07-20 21:34:24 UTC (rev 2853) +++ branches/2.3/src/org/python/core/PyType.java 2006-07-21 00:56:31 UTC (rev 2854) @@ -752,15 +752,7 @@ newtype.bases = bases_list; /* initialize tp flags */ - newtype.tp_flags=Py.TPFLAGS_DEFAULT | Py.TPFLAGS_HEAPTYPE | - Py.TPFLAGS_BASETYPE; - if ( (base.tp_flags & Py.TPFLAGS_HAVE_GC)>0 ) { - newtype.tp_flags|=Py.TPFLAGS_HAVE_GC; - } - if ( (base.tp_flags & Py.TPFLAGS_CHECKTYPES)>0 ) { - // || (base->tp_as_number == NULL)) { - newtype.tp_flags |= Py.TPFLAGS_CHECKTYPES; - } + newtype.tp_flags=Py.TPFLAGS_HEAPTYPE; newtype.needs_userdict = needs_userdict; newtype.nuserslots = nuserslots; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <m_...@us...> - 2006-07-22 02:40:45
|
Revision: 2856 Author: m_small Date: 2006-07-21 19:40:40 -0700 (Fri, 21 Jul 2006) ViewCVS: http://svn.sourceforge.net/jython/?rev=2856&view=rev Log Message: ----------- - change UnicodeType to PyUnicode (instead of PyString) - when using unicode __new__, even if the object is instanceof PyUnicode, still create a new PyUnicode. This fixes pickle infinite loops related to subclasses of unicode. Modified Paths: -------------- branches/2.3/src/org/python/core/PyUnicode.java branches/2.3/src/org/python/modules/types.java Modified: branches/2.3/src/org/python/core/PyUnicode.java =================================================================== --- branches/2.3/src/org/python/core/PyUnicode.java 2006-07-21 20:31:55 UTC (rev 2855) +++ branches/2.3/src/org/python/core/PyUnicode.java 2006-07-22 02:40:40 UTC (rev 2856) @@ -2747,9 +2747,10 @@ this(UNICODETYPE,String.valueOf(c)); } - final static PyObject unicode_new(PyNewWrapper new_, boolean init, PyType subtype, - PyObject[] args, String[] keywords) { - ArgParser ap = new ArgParser("unicode", args, keywords, new String[] { "S", "encoding", "errors" }, 0); + final static PyObject unicode_new(PyNewWrapper new_, boolean init, + PyType subtype, PyObject[] args, String[] keywords) { + ArgParser ap = new ArgParser("unicode", args, keywords, + new String[] { "S", "encoding", "errors" }, 0); PyObject S = ap.getPyObject(0, null); String encoding = ap.getString(1, null); String errors = ap.getString(2, null); @@ -2758,7 +2759,7 @@ return new PyUnicode(""); } if (S instanceof PyUnicode) { - return S; + return new PyUnicode( (String)S.__tojava__(String.class) ); } if (S instanceof PyString) { return new PyUnicode(codecs.decode((PyString)S, encoding, errors)); Modified: branches/2.3/src/org/python/modules/types.java =================================================================== --- branches/2.3/src/org/python/modules/types.java 2006-07-21 20:31:55 UTC (rev 2855) +++ branches/2.3/src/org/python/modules/types.java 2006-07-22 02:40:40 UTC (rev 2856) @@ -51,7 +51,7 @@ dict.__setitem__("TypeType", PyType.fromClass(PyType.class)); dict.__setitem__("UnboundMethodType", PyType.fromClass(PyMethod.class)); - dict.__setitem__("UnicodeType", PyType.fromClass(PyString.class)); + dict.__setitem__("UnicodeType", PyType.fromClass(PyUnicode.class)); dict.__setitem__("XRangeType", PyType.fromClass(PyXRange.class)); dict.__setitem__("StringTypes", new PyTuple(new PyObject[] { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <m_...@us...> - 2006-07-19 22:49:29
|
Revision: 2845 Author: m_small Date: 2006-07-19 15:49:26 -0700 (Wed, 19 Jul 2006) ViewCVS: http://svn.sourceforge.net/jython/?rev=2845&view=rev Log Message: ----------- re-apply Charlie (cgroves)'s codec fixes (patch 1516002). Modified Paths: -------------- branches/2.3/src/org/python/core/Py.java branches/2.3/src/org/python/core/PyString.java branches/2.3/src/org/python/core/codecs.java branches/2.3/src/org/python/core/exceptions.java branches/2.3/src/org/python/modules/_codecs.java Modified: branches/2.3/src/org/python/core/Py.java =================================================================== --- branches/2.3/src/org/python/core/Py.java 2006-07-19 22:38:16 UTC (rev 2844) +++ branches/2.3/src/org/python/core/Py.java 2006-07-19 22:49:26 UTC (rev 2845) @@ -229,6 +229,49 @@ return new PyException(Py.UnicodeError, message); } + public static PyObject UnicodeTranslateError; + public static PyException UnicodeTranslateError(String object, + int start, + int end, + String reason) { + return new PyException(Py.UnicodeTranslateError, + new PyTuple(new PyObject[] { + new PyString(object), + new PyInteger(start), + new PyInteger(end), + new PyString(reason)})); + } + + public static PyObject UnicodeDecodeError; + + public static PyException UnicodeDecodeError(String encoding, + String object, + int start, + int end, + String reason) { + return new PyException(Py.UnicodeDecodeError, + new PyTuple(new PyObject[] {new PyString(encoding), + new PyString(object), + new PyInteger(start), + new PyInteger(end), + new PyString(reason)})); + } + + public static PyObject UnicodeEncodeError; + + public static PyException UnicodeEncodeError(String encoding, + String object, + int start, + int end, + String reason) { + return new PyException(Py.UnicodeEncodeError, + new PyTuple(new PyObject[] {new PyString(encoding), + new PyString(object), + new PyInteger(start), + new PyInteger(end), + new PyString(reason)})); + } + public static PyObject EOFError; public static PyException EOFError(String message) { return new PyException(Py.EOFError, message); @@ -274,6 +317,11 @@ public static void DeprecationWarning(String message) { warning(DeprecationWarning, message); } + + public static PyObject PendingDeprecationWarning; + public static void PendingDeprecationWarning(String message) { + warning( PendingDeprecationWarning, message); + } public static PyObject SyntaxWarning; public static void SyntaxWarning(String message) { @@ -289,6 +337,11 @@ public static void RuntimeWarning(String message) { warning(RuntimeWarning, message); } + + public static PyObject FutureWarning; + public static void FutureWarning(String message) { + warning(FutureWarning, message); + } private static PyObject warnings_mod; private static PyObject importWarnings() { @@ -611,15 +664,20 @@ FloatingPointError = initExc("FloatingPointError", exc, dict); ValueError = initExc("ValueError", exc, dict); UnicodeError = initExc("UnicodeError", exc, dict); + UnicodeEncodeError = initExc("UnicodeEncodeError", exc, dict); + UnicodeDecodeError = initExc("UnicodeDecodeError", exc, dict); + UnicodeTranslateError = initExc("UnicodeTranslateError", exc, dict); ReferenceError = initExc("ReferenceError", exc, dict); SystemError = initExc("SystemError", exc, dict); MemoryError = initExc("MemoryError", exc, dict); Warning = initExc("Warning", exc, dict); UserWarning = initExc("UserWarning", exc, dict); DeprecationWarning = initExc("DeprecationWarning", exc, dict); + PendingDeprecationWarning = initExc("PendingDeprecationWarning", exc, dict); SyntaxWarning = initExc("SyntaxWarning", exc, dict); OverflowWarning = initExc("OverflowWarning", exc, dict); RuntimeWarning = initExc("RuntimeWarning", exc, dict); + FutureWarning = initExc("FutureWarning", exc, dict); } public static PySystemState defaultSystemState; Modified: branches/2.3/src/org/python/core/PyString.java =================================================================== --- branches/2.3/src/org/python/core/PyString.java 2006-07-19 22:38:16 UTC (rev 2844) +++ branches/2.3/src/org/python/core/PyString.java 2006-07-19 22:49:26 UTC (rev 2845) @@ -1614,7 +1614,7 @@ public PyObject __call__(PyObject arg0) { String result=self.str_join(arg0); //XXX: do we really need to check self? - if (self instanceof PyUnicode||arg0 instanceof PyUnicode) { + if (self instanceof PyUnicode||(arg0.__len__() > 0 && arg0.__getitem__(0) instanceof PyUnicode)) { return new PyUnicode(result); } else { return new PyString(result); @@ -1625,7 +1625,8 @@ PyString self=(PyString)gself; String result=self.str_join(arg0); //XXX: do we really need to check self? - if (self instanceof PyUnicode||arg0 instanceof PyUnicode) { + System.out.println("INST CALL"); + if (self instanceof PyUnicode||(arg0.__len__() > 0 && arg0.__getitem__(0) instanceof PyUnicode)) { return new PyUnicode(result); } else { return new PyString(result); @@ -2926,7 +2927,6 @@ StringBuffer v = new StringBuffer(str.length()); char quote = 0; - boolean unicode = false; if (use_quotes) { quote = str.indexOf('\'') >= 0 && @@ -2940,13 +2940,32 @@ if (use_quotes && (ch == quote || ch == '\\')) { v.append('\\'); v.append((char) ch); + continue; } + /* Map UTF-16 surrogate pairs to Unicode \UXXXXXXXX escapes */ + else if (ch >= 0xD800 && ch < 0xDC00) { + char ch2 = str.charAt(i++); + size--; + if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) { + int ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000; + v.append('\\'); + v.append('U'); + v.append(hexdigit[(ucs >> 28) & 0xf]); + v.append(hexdigit[(ucs >> 24) & 0xf]); + v.append(hexdigit[(ucs >> 20) & 0xf]); + v.append(hexdigit[(ucs >> 16) & 0xf]); + v.append(hexdigit[(ucs >> 12) & 0xf]); + v.append(hexdigit[(ucs >> 8) & 0xf]); + v.append(hexdigit[(ucs >> 4) & 0xf]); + v.append(hexdigit[ucs & 0xf]); + continue; + } + /* Fall through: isolated surrogates are copied as-is */ + i--; + size++; + } /* Map 16-bit characters to '\\uxxxx' */ - else if (ch >= 256) { - if (use_quotes && !unicode) { - v.insert(0, 'u'); - unicode = true; - } + if (ch >= 256) { v.append('\\'); v.append('u'); v.append(hexdigit[(ch >> 12) & 0xf]); @@ -2961,9 +2980,10 @@ else if (use_quotes && ch == '\f') v.append("\\f"); else if (use_quotes && ch == '\r') v.append("\\r"); else if (ch < ' ' || ch >= 127) { - v.append("\\x"); - v.append(hexdigit[(ch >> 4) & 0xF]); - v.append(hexdigit[ch & 0xF]); + v.append('\\'); + v.append('x'); + v.append(hexdigit[(ch >> 4) & 0xf]); + v.append(hexdigit[ch & 0xf]); } /* Copy everything else as-is */ else @@ -2976,177 +2996,265 @@ private static ucnhashAPI pucnHash = null; - public static String decode_UnicodeEscape(String str, int start, int end, - String errors, boolean unicode) - { - StringBuffer v = new StringBuffer(end-start); - for (int s = start; s < end; ) { + + public static String decode_UnicodeEscape(String str, + int start, + int end, + String errors, + boolean unicode) { + StringBuffer v = new StringBuffer(end - start); + for(int s = start; s < end;) { char ch = str.charAt(s); - /* Non-escape characters are interpreted as Unicode ordinals */ - if (ch != '\\') { + if(ch != '\\') { v.append(ch); s++; continue; } - + int loopStart = s; /* \ - Escapes */ s++; + if(s == end) { + s = codecs.insertReplacementAndGetResume(v, + errors, + "unicodeescape", + str, + loopStart, + s + 1, + "\\ at end of string"); + continue; + } ch = str.charAt(s++); - switch (ch) { - - /* \x escapes */ - case '\n': break; - case '\\': v.append('\\'); break; - case '\'': v.append('\''); break; - case '\"': v.append('\"'); break; - case 'b': v.append('\b'); break; - case 'f': v.append('\014'); break; /* FF */ - case 't': v.append('\t'); break; - case 'n': v.append('\n'); break; - case 'r': v.append('\r'); break; - case 'v': v.append('\013'); break; /* VT */ - case 'a': v.append('\007'); break; /* BEL, not classic C */ - - /* \OOO (octal) escapes */ - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - - int x = Character.digit(ch, 8); - for (int j = 0; j < 2 && s < end; j++, s++) { - ch = str.charAt(s); - if (ch < '0' || ch > '7') + switch(ch){ + /* \x escapes */ + case '\n': + break; + case '\\': + v.append('\\'); + break; + case '\'': + v.append('\''); + break; + case '\"': + v.append('\"'); + break; + case 'b': + v.append('\b'); + break; + case 'f': + v.append('\014'); + break; /* FF */ + case 't': + v.append('\t'); + break; + case 'n': + v.append('\n'); + break; + case 'r': + v.append('\r'); + break; + case 'v': + v.append('\013'); + break; /* VT */ + case 'a': + v.append('\007'); + break; /* BEL, not classic C */ + /* \OOO (octal) escapes */ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + int x = Character.digit(ch, 8); + for(int j = 0; j < 2 && s < end; j++, s++) { + ch = str.charAt(s); + if(ch < '0' || ch > '7') + break; + x = (x << 3) + Character.digit(ch, 8); + } + v.append((char)x); + break; + case 'x': + s = hexescape(v, errors, 2, s, str, end, "truncated \\xXX"); + break; + case 'u': + if(!unicode) { + v.append('\\'); + v.append('u'); break; - x = (x<<3) + Character.digit(ch, 8); - } - v.append((char) x); - break; - - case 'x': - int i; - for (x = 0, i = 0; i < 2 && s < end; i++) { - ch = str.charAt(s + i); - int d = Character.digit(ch, 16); - if (d == -1) { - codecs.decoding_error("unicode escape", v, errors, - "truncated \\xXX"); - i++; + } + s = hexescape(v, + errors, + 4, + s, + str, + end, + "truncated \\uXXXX"); + break; + case 'U': + if(!unicode) { + v.append('\\'); + v.append('U'); break; } - - x = ((x<<4) & ~0xF) + d; - } - s += i; - v.append((char) x); - break; - - /* \ uXXXX with 4 hex digits */ - case 'u': - if (!unicode) { - v.append('\\'); - v.append('u'); + s = hexescape(v, + errors, + 8, + s, + str, + end, + "truncated \\UXXXXXXXX"); break; - } - if (s+4 > end) { - codecs.decoding_error("unicode escape", v, errors, - "truncated \\uXXXX"); - break; - } - for (x = 0, i = 0; i < 4; i++) { - ch = str.charAt(s + i); - int d = Character.digit(ch, 16); - if (d == -1) { - codecs.decoding_error("unicode escape", v, errors, - "truncated \\uXXXX"); + case 'N': + if(!unicode) { + v.append('\\'); + v.append('N'); break; } - x = ((x<<4) & ~0xF) + d; - } - s += i; - v.append((char) x); - break; - - case 'N': - if (!unicode) { - v.append('\\'); - v.append('N'); - break; - } - /* Ok, we need to deal with Unicode Character Names now, - * make sure we've imported the hash table data... - */ - if (pucnHash == null) { - PyObject mod = imp.importName("ucnhash", true); - mod = mod.__call__(); - pucnHash = (ucnhashAPI) mod.__tojava__(Object.class); - if (pucnHash.getCchMax() < 0) - codecs.decoding_error("unicode escape", v, errors, - "Unicode names not loaded"); - } - - if (str.charAt(s) == '{') { - int startName = s + 1; - int endBrace = startName; - - /* look for either the closing brace, or we - * exceed the maximum length of the unicode - * character names + /* + * Ok, we need to deal with Unicode Character Names now, + * make sure we've imported the hash table data... */ - int maxLen = pucnHash.getCchMax(); - while (endBrace < end && str.charAt(endBrace) != '}' - && (endBrace - startName) <= maxLen) { - endBrace++; + if(pucnHash == null) { + PyObject mod = imp.importName("ucnhash", true); + mod = mod.__call__(); + pucnHash = (ucnhashAPI)mod.__tojava__(Object.class); + if(pucnHash.getCchMax() < 0) + throw Py.UnicodeError("Unicode names not loaded"); } - if (endBrace != end && str.charAt(endBrace) == '}') { - int value = pucnHash.getValue(str, startName, - endBrace); - if (value < 0) { - codecs.decoding_error("unicode escape", v, - errors, "Invalid Unicode Character Name"); - v.append('\\'); - v.append(str.charAt(s-1)); - break; - } - - if (value < 1<<16) { - /* In UCS-2 range, easy solution.. */ - v.append((char) value); - } else { - /* Oops, its in UCS-4 space, */ - /* compute and append the two surrogates: */ - /* translate from 10000..10FFFF to 0..FFFFF */ - value -= 0x10000; - - /* high surrogate = top 10 bits added to D800 */ - v.append((char) (0xD800 + (value >> 10))); - - /* low surrogate = bottom 10 bits added to DC00*/ - v.append((char) (0xDC00 + (value & ~0xFC00))); + if(str.charAt(s) == '{') { + int startName = s + 1; + int endBrace = startName; + /* + * look for either the closing brace, or we exceed the + * maximum length of the unicode character names + */ + int maxLen = pucnHash.getCchMax(); + while(endBrace < end && str.charAt(endBrace) != '}' + && (endBrace - startName) <= maxLen) { + endBrace++; } - s = endBrace + 1; + if(endBrace != end && str.charAt(endBrace) == '}') { + int value = pucnHash.getValue(str, + startName, + endBrace); + if(storeUnicodeCharacter(value, v)) { + s = endBrace + 1; + } else { + s = codecs.insertReplacementAndGetResume(v, + errors, + "unicodeescape", + str, + loopStart, + endBrace + 1, + "illegal Unicode character"); + } + } else { + s = codecs.insertReplacementAndGetResume(v, + errors, + "unicodeescape", + str, + loopStart, + endBrace, + "malformed \\N character escape"); + } + break; } else { - codecs.decoding_error("unicode escape", v, errors, - "Unicode name missing closing brace"); - v.append('\\'); - v.append(str.charAt(s-1)); - break; + s = codecs.insertReplacementAndGetResume(v, + errors, + "unicodeescape", + str, + loopStart, + s + 1, + "malformed \\N character escape"); } break; - } - codecs.decoding_error("unicode escape", v, errors, - "Missing opening brace for Unicode " + - "Character Name escape"); + default: + v.append('\\'); + v.append(str.charAt(s - 1)); + break; + } + } + return v.toString(); + } - /* fall through on purpose */ - default: - v.append('\\'); - v.append(str.charAt(s-1)); - break; - } - } - return v.toString(); + private static int hexescape(StringBuffer partialDecode, + String errors, + int digits, + int hexDigitStart, + String str, + int size, + String errorMessage) { + if(hexDigitStart + digits > size) { + return codecs.insertReplacementAndGetResume(partialDecode, + errors, + "unicodeescape", + str, + hexDigitStart - 2, + size, + errorMessage); + } + int i = 0; + int x = 0; + for(; i < digits; ++i) { + char c = str.charAt(hexDigitStart + i); + int d = Character.digit(c, 16); + if(d == -1) { + return codecs.insertReplacementAndGetResume(partialDecode, + errors, + "unicodeescape", + str, + hexDigitStart - 2, + hexDigitStart + i + 1, + errorMessage); + } + x = (x << 4) & ~0xF; + if(c >= '0' && c <= '9') + x += c - '0'; + else if(c >= 'a' && c <= 'f') + x += 10 + c - 'a'; + else + x += 10 + c - 'A'; + } + if(storeUnicodeCharacter(x, partialDecode)) { + return hexDigitStart + i; + } else { + return codecs.insertReplacementAndGetResume(partialDecode, + errors, + "unicodeescape", + str, + hexDigitStart - 2, + hexDigitStart + i + 1, + "illegal Unicode character"); + } } + /*pass in an int since this can be a UCS-4 character */ + private static boolean storeUnicodeCharacter(int value, + StringBuffer partialDecode) { + if(value < 0) { + return false; + } else if(value < 1 << 16) { + /* In UCS-2 range, easy solution.. */ + partialDecode.append((char)value); + return true; + } else if(value <= 0x10ffff) { + /* Oops, its in UCS-4 space, */ + /* compute and append the two surrogates: */ + /* translate from 10000..10FFFF to 0..FFFFF */ + value -= 0x10000; + /* high surrogate = top 10 bits added to D800 */ + partialDecode.append((char)(0xD800 + (value >> 10))); + /* low surrogate = bottom 10 bits added to DC00 */ + partialDecode.append((char)(0xDC00 + (value & ~0xFC00))); + return true; + } + return false; + } + public boolean equals(Object other) { if (!(other instanceof PyString)) return false; @@ -3306,7 +3414,11 @@ for (int i=0; i<count; i++) { string.getChars(0, s, new_chars, i*s); } - return new PyString(new String(new_chars)); + if (this instanceof PyUnicode) { + return new PyUnicode(new String(new_chars)); + } else { + return new PyString(new String(new_chars)); + } } final PyObject str___mul__(PyObject o) { @@ -4871,6 +4983,11 @@ } public String formatLong(PyString arg, char type, boolean altFlag) { + if(precision > 250){ + // A magic number. Larger than in CPython. + throw Py.OverflowError( + "formatted long is too long (precision too long?)"); + } String s = arg.toString(); int end = s.length(); int ptr = 0; @@ -4928,6 +5045,11 @@ } public String formatInteger(long v, int radix, boolean unsigned) { + if(precision > 250){ + // A magic number. Larger than in CPython. + throw Py.OverflowError( + "formatted integer is too long (precision too long?)"); + } if (unsigned) { if (v < 0) v = 0x100000000l + v; @@ -4949,6 +5071,11 @@ } public String formatFloatDecimal(double v, boolean truncate) { + if(precision > 250) { + // A magic number. Larger than in CPython. + throw Py.OverflowError( + "formatted float is too long (precision too long?)"); + } java.text.NumberFormat format = java.text.NumberFormat.getInstance( java.util.Locale.US); int prec = precision; @@ -5087,11 +5214,6 @@ precision = getNumber(); if (precision < -1) precision = 0; - if (precision > 250) { - // A magic number. Larger than in CPython. - throw Py.OverflowError( - "formatted float is too long (precision too long?)"); - } c = pop(); } @@ -5111,7 +5233,6 @@ fill = '0'; else fill = ' '; - switch(c) { case 's': case 'r': Modified: branches/2.3/src/org/python/core/codecs.java =================================================================== --- branches/2.3/src/org/python/core/codecs.java 2006-07-19 22:38:16 UTC (rev 2844) +++ branches/2.3/src/org/python/core/codecs.java 2006-07-19 22:49:26 UTC (rev 2845) @@ -8,16 +8,29 @@ package org.python.core; + + /** * Contains the implementation of the builtin codecs. * @since Jython 2.0 */ public class codecs { + + + public static final String BACKSLASHREPLACE = "backslashreplace"; + + public static final String IGNORE = "ignore"; + + public static final String REPLACE = "replace"; + + public static final String XMLCHARREFREPLACE = "xmlcharrefreplace"; + private static char Py_UNICODE_REPLACEMENT_CHARACTER = 0xFFFD; - private static PyList searchPath = new PyList(); - private static PyStringMap searchCache = new PyStringMap(); + private static PyList searchPath; + private static PyStringMap searchCache; + private static PyStringMap errorHandlers; private static String default_encoding = "ascii"; @@ -29,8 +42,30 @@ lookup(encoding); default_encoding = encoding; } + + public static PyObject lookup_error(String handlerName){ + registry_init(); + if(handlerName == null){ + handlerName = "strict"; + } + PyObject handler = (PyObject)errorHandlers.__finditem__(handlerName.intern()); + if(handler == null){ + throw new PyException(Py.LookupError, + "unknown error handler name '" + handlerName + "'"); + } + return handler; + } + + public static void register_error(String name, PyObject error){ + registry_init(); + if (!error.isCallable()) { + throw Py.TypeError("argument must be callable"); + } + errorHandlers.__setitem__(name.intern(), error); + } public static void register(PyObject search_function) { + registry_init(); if (!search_function.isCallable()) { throw Py.TypeError("argument must be callable"); } @@ -39,7 +74,7 @@ public static PyTuple lookup(String encoding) { - import_encodings(); + registry_init(); PyString v = new PyString(normalizestring(encoding)); PyObject result = searchCache.__finditem__(v); if (result != null) { @@ -108,15 +143,7 @@ errors = errors.intern(); } - /* Shortcuts for common default encodings */ -/* - if (encoding.equals("utf-8")) - return utf_8_decode(v, errors).__getitem__(0).__str__(); - else if (encoding.equals("latin-1")) - ; //return PyUnicode_DecodeLatin1(s, size, errors); - else if (encoding.equals("ascii")) - ; //return PyUnicode_DecodeASCII(s, size, errors); -*/ + /* Shortcut for ascii encoding */ if (encoding.equals("ascii")) { return PyUnicode_DecodeASCII(v.toString(), v.__len__(), errors); @@ -159,16 +186,12 @@ errors = errors.intern(); } - /* Shortcuts for common default encodings */ -/* - if (encoding.equals("utf-8")) - return PyUnicode_DecodeUTF8(v.toString(), v.__len__(), errors); - else if (encoding.equals("latin-1")) - return PyUnicode_DecodeLatin1(v.toString(), v.__len__(), errors); - else -*/ + /* Shortcuts for common default encodings. latin-1 must not use the + * lookup registry for the encodigs module to work correctly */ + if (encoding.equals("latin-1")){ + return PyUnicode_EncodeLatin1(v.toString(), v.__len__(), errors); - if (encoding.equals("ascii")) { + }else if (encoding.equals("ascii")) { return PyUnicode_EncodeASCII(v.toString(), v.__len__(), errors); } @@ -193,8 +216,465 @@ PyObject codecs = lookup(encoding); return codecs.__getitem__(0); } + + public static PyObject strict_errors(PyObject[] args, String[] kws){ + ArgParser ap = new ArgParser("strict_errors", args, kws, "exc"); + PyObject exc = ap.getPyObject(0); + if(Py.isInstance(exc, Py.UnicodeDecodeError)){ + throw new PyException(Py.UnicodeDecodeError, exc); + }else if(Py.isInstance(exc, Py.UnicodeEncodeError)){ + throw new PyException(Py.UnicodeEncodeError, exc); + }else if(Py.isInstance(exc, Py.UnicodeTranslateError)){ + throw new PyException(Py.UnicodeTranslateError, exc); + } + throw wrong_exception_type(exc); + } + + public static PyObject ignore_errors(PyObject[] args, String[] kws){ + ArgParser ap = new ArgParser("ignore_errors", args, kws, "exc"); + PyObject exc = ap.getPyObject(0); + if(!isUnicodeError(exc)){ + throw wrong_exception_type(exc); + } + PyObject end = exc.__getattr__("end"); + return new PyTuple(new PyObject[]{Py.java2py(""), end}); + } + private static boolean isUnicodeError(PyObject exc) { + return Py.isInstance(exc, Py.UnicodeDecodeError) || + Py.isInstance(exc, Py.UnicodeEncodeError) || + Py.isInstance(exc, Py.UnicodeTranslateError); + } + + public static PyObject replace_errors(PyObject[] args, String[] kws){ + ArgParser ap = new ArgParser("replace_errors", args, kws, "exc"); + PyObject exc = ap.getPyObject(0); + if(Py.isInstance(exc, Py.UnicodeDecodeError)){ + PyObject end = exc.__getattr__("end"); + return new PyTuple(new PyObject[]{new PyUnicode(Py_UNICODE_REPLACEMENT_CHARACTER), end}); + }else if(Py.isInstance(exc, Py.UnicodeEncodeError)){ + PyObject end = exc.__getattr__("end"); + return new PyTuple(new PyObject[]{Py.java2py("?"), end}); + }else if(Py.isInstance(exc, Py.UnicodeTranslateError)){ + PyObject end = exc.__getattr__("end"); + return new PyTuple(new PyObject[]{new PyUnicode(Py_UNICODE_REPLACEMENT_CHARACTER), end}); + } + throw wrong_exception_type(exc); + } + + public static PyObject xmlcharrefreplace_errors(PyObject[] args, String[] kws){ + ArgParser ap = new ArgParser("xmlcharrefreplace_errors", args, kws, "exc"); + PyObject exc = ap.getPyObject(0); + if(!Py.isInstance(exc, Py.UnicodeEncodeError)){ + throw wrong_exception_type(exc); + } + int start = ((PyInteger)exc.__getattr__("start")).getValue(); + int end = ((PyInteger)exc.__getattr__("end")).getValue(); + String object = exc.__getattr__("object").toString(); + StringBuffer replacement = new StringBuffer(); + xmlcharrefreplace_internal(start, end, object, replacement); + return new PyTuple(new PyObject[]{Py.java2py(replacement.toString()), exc.__getattr__("end")}); + } + + public static StringBuffer xmlcharrefreplace(int start, int end, String toReplace){ + StringBuffer replacement = new StringBuffer(); + xmlcharrefreplace_internal(start, end, toReplace, replacement); + return replacement; + } + private static void xmlcharrefreplace_internal(int start, int end, String object, StringBuffer replacement) { + for(int i = start; i < end; i++) { + replacement.append("&#"); + char cur = object.charAt(i); + int digits; + int base; + if(cur < 10) { + digits = 1; + base = 1; + } else if(cur < 100) { + digits = 2; + base = 10; + } else if(cur < 1000) { + digits = 3; + base = 100; + } else if(cur < 10000) { + digits = 4; + base = 1000; + } else if(cur < 100000) { + digits = 5; + base = 10000; + } else if(cur < 1000000) { + digits = 6; + base = 100000; + } else { + digits = 7; + base = 1000000; + } + while(digits-- > 0) { + replacement.append((char)('0' + cur / base)); + cur %= base; + base /= 10; + } + replacement.append(';'); + } + } + + private static PyException wrong_exception_type(PyObject exc) { + PyObject excClass = exc.__getattr__("__class__"); + PyObject className = excClass.__getattr__("__name__"); + return new PyException(Py.TypeError, "Don't know how to handle " + + className + " in error callback"); + } + + + static char hexdigits[] = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' + }; + + public static PyObject backslashreplace_errors(PyObject[] args, String[] kws){ + ArgParser ap = new ArgParser("backslashreplace_errors", args, kws, "exc"); + PyObject exc = ap.getPyObject(0); + if(!Py.isInstance(exc, Py.UnicodeEncodeError)){ + throw wrong_exception_type(exc); + } + int start = ((PyInteger)exc.__getattr__("start")).getValue(); + int end = ((PyInteger)exc.__getattr__("end")).getValue(); + String object = exc.__getattr__("object").toString(); + StringBuffer replacement = new StringBuffer(); + backslashreplace_internal(start, end, object, replacement); + return new PyTuple(new PyObject[]{Py.java2py(replacement.toString()), exc.__getattr__("end")}); + } + + public static StringBuffer backslashreplace(int start, int end, String toReplace){ + StringBuffer replacement = new StringBuffer(); + backslashreplace_internal(start, end, toReplace, replacement); + return replacement; + } + + private static void backslashreplace_internal(int start, int end, String object, StringBuffer replacement) { + for(int i = start; i < end; i++) { + replacement.append('\\'); + char c = object.charAt(i); + if(c >= 0x00010000) { + replacement.append('U'); + replacement.append(hexdigits[(c >> 28) & 0xf]); + replacement.append(hexdigits[(c >> 24) & 0xf]); + replacement.append(hexdigits[(c >> 20) & 0xf]); + replacement.append(hexdigits[(c >> 16) & 0xf]); + replacement.append(hexdigits[(c >> 12) & 0xf]); + replacement.append(hexdigits[(c >> 8) & 0xf]); + } else if(c >= 0x100) { + replacement.append('u'); + replacement.append(hexdigits[(c >> 12) & 0xf]); + replacement.append(hexdigits[(c >> 8) & 0xf]); + } else + replacement.append('x'); + replacement.append(hexdigits[(c >> 4) & 0xf]); + replacement.append(hexdigits[c & 0xf]); + } + } + + private static void registry_init(){ + if(searchPath != null) + return; + searchPath = new PyList(); + searchCache = new PyStringMap(); + errorHandlers = new PyStringMap(); + String[] builtinErrorHandlers = new String[] {"strict", + IGNORE, + REPLACE, + XMLCHARREFREPLACE, + BACKSLASHREPLACE}; + for(int i = 0; i < builtinErrorHandlers.length; i++) { + register_error(builtinErrorHandlers[i], + Py.newJavaFunc(codecs.class, builtinErrorHandlers[i] + + "_errors")); + } + import_encodings(); + } + /* --- UTF-7 Codec -------------------------------------------------------- */ + + /* see RFC2152 for details */ + + + public static + char utf7_special[] = { + /* + * indicate whether a UTF-7 character is special i.e. cannot be directly + * encoded: 0 - not special 1 - special 2 - whitespace (optional) 3 - + * RFC2152 Set O (optional) + */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 3, 3, 3, + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 1, 1, + + }; + + private static boolean SPECIAL(char c, boolean encodeO, boolean encodeWS){ + return (c>127 || utf7_special[(c)] == 1) || + (encodeWS && (utf7_special[(c)] == 2)) || + (encodeO && (utf7_special[(c)] == 3)); + } + + private static final String B64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + private static char B64(int n){ + return B64_CHARS.charAt(n & 0x3f); + } + + private static boolean B64CHAR(char c) { + return B64_CHARS.indexOf(c) != -1; + } + + private static int UB64(char c) { + return ((c) == '+' ? 62 : (c) == '/' ? 63 : (c) >= 'a' ? + (c) - 71 : (c) >= 'A' ? (c) - 65 : (c) + 4); + } + + public static String PyUnicode_DecodeUTF7(String str, + String errors) { + int s = 0; + int e = str.length(); + boolean inShift = false; + int bitsInCharsleft = 0; + long charsleft = 0; + boolean surrogate = false; + char highOrderSurrogate = 0; + StringBuffer unicode = new StringBuffer(e); + while(s < e) { + // restart: + char ch = str.charAt(s); + if(inShift) { + if((ch == '-') || !B64CHAR(ch)) { + inShift = false; + s++; + while(bitsInCharsleft >= 16) { + bitsInCharsleft -= 16; + char outCh = (char)((charsleft >> bitsInCharsleft) & 0xffff); + if(surrogate) { + if(0xD800 <= outCh && outCh <= 0xDBFF) { + unicode.append(highOrderSurrogate); + unicode.append(outCh); + } else { + s = codecs.insertReplacementAndGetResume(unicode, + errors, + "utf-16", + str, + s, + s + 1, + "illegal UTF-16 surrogate"); + } + surrogate = false; + } else if(0xDC00 <= outCh && outCh <= 0xDFFF) { + surrogate = true; + highOrderSurrogate = outCh; + } else { + unicode.append(outCh); + } + } + if(bitsInCharsleft >= 6) { + /* + * The shift sequence has a partial character in it. If + * bitsleft < 6 then we could just classify it as + * padding but that is not the case here + */ + s = insertReplacementAndGetResume(unicode, + errors, + "utf-7", + str, + s, + s + 1, + "partial character in shift sequence"); + } + /* + * According to RFC2152 the remaining bits should be zero. + * We choose to signal an error/insert a replacement + * character here so indicate the potential of a misencoded + * character. + */ + if(bitsInCharsleft > 0 && ((charsleft << 5 - bitsInCharsleft) & 0x1f) > 0){ + s = insertReplacementAndGetResume(unicode, + errors, + "utf-7", + str, + s, + s + 1, + "non-zero padding bits in shift sequence"); + } + if(ch == '-') { + if((s < e) && (str.charAt(s) == '-')) { + unicode.append('-'); + inShift = true; + } + } else if(SPECIAL(ch, false, false)) { + s = insertReplacementAndGetResume(unicode, + errors, + "utf-7", + str, + s, + s + 1, + "unexpected special character"); + } else { + unicode.append(ch); + } + } else { + charsleft = (charsleft << 6) | UB64(ch); + bitsInCharsleft += 6; + s++; + while(bitsInCharsleft >= 16) { + bitsInCharsleft -= 16; + char outCh = (char)((charsleft >> bitsInCharsleft) & 0xffff); + if(surrogate) { + if(0xD800 <= outCh && outCh <= 0xDBFF) { + unicode.append(highOrderSurrogate); + unicode.append(outCh); + } else { + s = codecs.insertReplacementAndGetResume(unicode, + errors, + "utf-16", + str, + s, + s + 1, + "illegal UTF-16 surrogate"); + } + surrogate = false; + } else if(0xDC00 <= outCh && outCh <= 0xDFFF) { + surrogate = true; + highOrderSurrogate = outCh; + } else { + unicode.append(outCh); + } + } + } + } else if(ch == '+') { + s++; + if(s < e && str.charAt(s) == '-') { + s++; + unicode.append('+'); + } else { + inShift = true; + bitsInCharsleft = 0; + } + } else if(SPECIAL(ch, false, false)) { + s = insertReplacementAndGetResume(unicode, + errors, + "utf-7", + str, + s, + s + 1, + "unexpected special character"); + } else { + unicode.append(ch); + s++; + } + if(inShift && s == e) { + s = insertReplacementAndGetResume(unicode, + errors, + "utf-7", + str, + s, + s, + "unterminated shift sequence"); + } + } + return unicode.toString(); + } + + + public static String PyUnicode_EncodeUTF7(String str, + boolean encodeSetO, + boolean encodeWhiteSpace, + String errors) + { + int size = str.length(); + + if (size == 0) + return ""; + boolean inShift = false; + int bitsleft = 0; + int charsleft = 0; + + StringBuffer v = new StringBuffer(); + + for (int i = 0;i < size; ++i) { + char ch = str.charAt(i); + + if (!inShift) { + if (ch == '+') { + v.append('+'); + v.append('-'); + } else if (SPECIAL(ch, encodeSetO, encodeWhiteSpace)) { + charsleft = ch; + bitsleft = 16; + v.append('+'); + while (bitsleft >= 6) { + v.append(B64(charsleft >> (bitsleft-6))); + bitsleft -= 6; + } + inShift = bitsleft > 0; + } else { + v.append((char) ch); + } + } else { + if (!SPECIAL(ch, encodeSetO, encodeWhiteSpace)) { + v.append(B64(charsleft << (6-bitsleft))); + charsleft = 0; + bitsleft = 0; + /* Characters not in the BASE64 set implicitly unshift the sequence + so no '-' is required, except if the character is itself a '-' */ + if (B64CHAR(ch) || ch == '-') { + v.append('-'); + } + inShift = false; + v.append( ch); + } else { + bitsleft += 16; + charsleft = (charsleft << 16) | ch; + while (bitsleft >= 6) { + v.append(B64(charsleft >> (bitsleft-6))); + bitsleft -= 6; + } + /* If the next character is special then we dont' need to terminate + the shift sequence. If the next character is not a BASE64 character + or '-' then the shift sequence will be terminated implicitly and we + don't have to insert a '-'. */ + + if (bitsleft == 0) { + if (i + 1 < size) { + char ch2 = str.charAt(i+1); + + if (SPECIAL(ch2, encodeSetO, encodeWhiteSpace)) { + + } else if (B64CHAR(ch2) || ch2 == '-') { + v.append('-'); + inShift = false; + } else { + inShift = false; + } + + } + else { + v.append('-'); + inShift = false; + } + } + } + } + } + if (bitsleft > 0) { + v.append(B64(charsleft << (6-bitsleft))); + v.append('-'); + } + return v.toString(); + } + + /* --- UTF-8 Codec ---------------------------------------------------- */ private static byte utf8_code_length[] = { /* Map UTF-8 encoded prefix byte to sequence length. zero means @@ -225,53 +705,41 @@ /* Unpack UTF-8 encoded data */ for (int i = 0; i < size; ) { int ch = str.charAt(i); - if (ch > 0xFF) { - codecs.decoding_error("utf-8", unicode, errors, - "ordinal not in range(255)"); - i++; - continue; - } if (ch < 0x80) { unicode.append((char) ch); i++; continue; } + if (ch > 0xFF) { + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 1, "ordinal not in range(255)"); + continue; + } int n = utf8_code_length[ch]; if (i + n > size) { - codecs.decoding_error("utf-8", unicode, errors, - "unexpected end of data"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 1, "unexpected end of data"); continue; } switch (n) { case 0: - codecs.decoding_error("utf-8", unicode, errors, - "unexpected code byte"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 1, "unexpected code byte"); continue; case 1: - codecs.decoding_error("utf-8", unicode, errors, - "internal error"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 1, "internal error"); continue; case 2: char ch1 = str.charAt(i+1); if ((ch1 & 0xc0) != 0x80) { - codecs.decoding_error("utf-8", unicode, errors, - "invalid data"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 2, "invalid data"); continue; } ch = ((ch & 0x1f) << 6) + (ch1 & 0x3f); if (ch < 0x80) { - codecs.decoding_error("utf-8", unicode, errors, - "illegal encoding"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 2, "illegal encoding"); continue; } else unicode.append((char) ch); @@ -281,16 +749,12 @@ ch1 = str.charAt(i+1); char ch2 = str.charAt(i+2); if ((ch1 & 0xc0) != 0x80 || (ch2 & 0xc0) != 0x80) { - codecs.decoding_error("utf-8", unicode, errors, - "invalid data"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 3, "invalid data"); continue; } ch = ((ch & 0x0f) << 12) + ((ch1 & 0x3f) << 6) + (ch2 & 0x3f); if (ch < 0x800 || (ch >= 0xd800 && ch < 0xe000)) { - codecs.decoding_error("utf-8", unicode, errors, - "illegal encoding"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 3, "illegal encoding"); continue; } else unicode.append((char) ch); @@ -303,9 +767,7 @@ if ((ch1 & 0xc0) != 0x80 || (ch2 & 0xc0) != 0x80 || (ch3 & 0xc0) != 0x80) { - codecs.decoding_error("utf-8", unicode, errors, - "invalid data"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 4, "invalid data"); continue; } ch = ((ch & 0x7) << 18) + ((ch1 & 0x3f) << 12) + @@ -315,9 +777,7 @@ byte encoding */ (ch > 0x10ffff)) { /* maximum value allowed for UTF-16 */ - codecs.decoding_error("utf-8", unicode, errors, - "illegal encoding"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + 4, "illegal encoding"); continue; } /* compute and append the two surrogates: */ @@ -334,9 +794,8 @@ default: /* Other sizes are only needed for UCS-4 */ - codecs.decoding_error("utf-8", unicode, errors, - "unsupported Unicode code range"); - i++; + i = insertReplacementAndGetResume(unicode, errors, "utf-8", str, i, i + n, "unsupported Unicode code range"); + continue; } i += n; } @@ -380,22 +839,33 @@ } - - /* --- 7-bit ASCII Codec -------------------------------------------- */ - public static String PyUnicode_DecodeASCII(String str, int size, String errors) { + return PyUnicode_DecodeIntLimited(str, size, errors, "ascii", 128); + } + + public static String PyUnicode_DecodeLatin1(String str, int size, + ... [truncated message content] |
From: <cg...@us...> - 2006-07-27 05:51:18
|
Revision: 2862 Author: cgroves Date: 2006-07-26 20:51:18 -0700 (Wed, 26 Jul 2006) ViewCVS: http://svn.sourceforge.net/jython/?rev=2862&view=rev Log Message: ----------- return type unicode if a unicode type is passed in. Modified Paths: -------------- branches/2.3/src/org/python/core/PyString.java branches/2.3/src/org/python/core/PyUnicode.java branches/2.3/src/org/python/modules/sre/MatchObject.java branches/2.3/src/org/python/modules/sre/PatternObject.java branches/2.3/src/org/python/modules/sre/ScannerObject.java Modified: branches/2.3/src/org/python/core/PyString.java =================================================================== --- branches/2.3/src/org/python/core/PyString.java 2006-07-26 03:48:26 UTC (rev 2861) +++ branches/2.3/src/org/python/core/PyString.java 2006-07-27 03:51:18 UTC (rev 2862) @@ -1625,7 +1625,6 @@ PyString self=(PyString)gself; String result=self.str_join(arg0); //XXX: do we really need to check self? - System.out.println("INST CALL"); if (self instanceof PyUnicode||(arg0.__len__() > 0 && arg0.__getitem__(0) instanceof PyUnicode)) { return new PyUnicode(result); } else { @@ -3383,7 +3382,7 @@ if (step > 0 && stop < start) stop = start; if (step == 1) - return new PyString(string.substring(start, stop)); + return fromSubstring(start, stop); else { int n = sliceLength(start, stop, step); char new_chars[] = new char[n]; @@ -3391,10 +3390,14 @@ for (int i=start; j<n; i+=step) new_chars[j++] = string.charAt(i); - return new PyString(new String(new_chars)); + return createInstance(new String(new_chars)); } } + public PyString createInstance(String str) { + return new PyString(str); + } + public boolean __contains__(PyObject o) { return str___contains__(o); } @@ -3414,11 +3417,7 @@ for (int i=0; i<count; i++) { string.getChars(0, s, new_chars, i*s); } - if (this instanceof PyUnicode) { - return new PyUnicode(new String(new_chars)); - } else { - return new PyString(new String(new_chars)); - } + return createInstance(new String(new_chars)); } final PyObject str___mul__(PyObject o) { @@ -3443,11 +3442,10 @@ if (generic_other instanceof PyString) { PyString other = (PyString)generic_other; String result = string.concat(other.string); - if (this instanceof PyUnicode || generic_other instanceof PyUnicode) { + if (generic_other instanceof PyUnicode) { return new PyUnicode(result); - } else { - return new PyString(result); } + return createInstance(result); } else return null; } @@ -3488,10 +3486,9 @@ return str___getnewargs__(); } - //XXX: PyUnicode? public PyObject __mod__(PyObject other) { StringFormatter fmt = new StringFormatter(string); - return new PyString(fmt.format(other)); + return createInstance(fmt.format(other)); } public PyObject __int__() { @@ -3923,7 +3920,7 @@ } protected PyString fromSubstring(int begin, int end) { - return new PyString(string.substring(begin, end)); + return createInstance(string.substring(begin, end)); } public int index(String sub) { @@ -4417,7 +4414,7 @@ } final String str_replace(String oldPiece, String newPiece, int maxsplit) { - PyString newstr = new PyString(newPiece); + PyString newstr = createInstance(newPiece); return newstr.join(split(oldPiece, maxsplit)); } Modified: branches/2.3/src/org/python/core/PyUnicode.java =================================================================== --- branches/2.3/src/org/python/core/PyUnicode.java 2006-07-26 03:48:26 UTC (rev 2861) +++ branches/2.3/src/org/python/core/PyUnicode.java 2006-07-27 03:51:18 UTC (rev 2862) @@ -2780,6 +2780,10 @@ public String safeRepr() throws PyIgnoreMethodTag { return "'unicode' object"; } + + public PyString createInstance(String str){ + return new PyUnicode(str); + } final PyUnicode unicode___unicode__() { return str___unicode__(); Modified: branches/2.3/src/org/python/modules/sre/MatchObject.java =================================================================== --- branches/2.3/src/org/python/modules/sre/MatchObject.java 2006-07-26 03:48:26 UTC (rev 2861) +++ branches/2.3/src/org/python/modules/sre/MatchObject.java 2006-07-27 03:51:18 UTC (rev 2862) @@ -15,11 +15,18 @@ package org.python.modules.sre; -import org.python.core.*; +import org.python.core.ArgParser; +import org.python.core.Py; +import org.python.core.PyDictionary; +import org.python.core.PyInteger; +import org.python.core.PyObject; +import org.python.core.PyString; +import org.python.core.PyTuple; +import org.python.core.imp; public class MatchObject extends PyObject { - public String string; /* link to the target string */ + public PyString string; /* link to the target string */ public PyObject regs; /* cached list of matching spans */ PatternObject pattern; /* link to the regex (pattern) object */ int pos, endpos; /* current target slice */ @@ -173,8 +180,8 @@ if (string == null || start < 0) return def; + return string.__getslice__(Py.newInteger(start), Py.newInteger(end)); - return new PyString(string.substring(start, end)); } public PyObject __findattr__(String key) { Modified: branches/2.3/src/org/python/modules/sre/PatternObject.java =================================================================== --- branches/2.3/src/org/python/modules/sre/PatternObject.java 2006-07-26 03:48:26 UTC (rev 2861) +++ branches/2.3/src/org/python/modules/sre/PatternObject.java 2006-07-27 03:51:18 UTC (rev 2862) @@ -21,7 +21,7 @@ public class PatternObject extends PyObject { char[] code; /* link to the code string object */ - public String pattern; /* link to the pattern source (or None) */ + public PyString pattern; /* link to the pattern source (or None) */ public int groups; public org.python.core.PyObject groupindex; public int flags; @@ -33,7 +33,7 @@ int groups, PyObject groupindex, PyObject indexgroup) { if (pattern != null) - this.pattern = pattern.toString(); + this.pattern = pattern; this.flags = flags; this.code = code; this.codesize = code.length; @@ -42,34 +42,28 @@ this.indexgroup = indexgroup; } - public MatchObject match(String string) { - return match(string, 0, Integer.MAX_VALUE); - } + public MatchObject match(PyObject[] args, String[] kws) { + ArgParser ap = new ArgParser("search", args, kws, + "pattern", "pos", "endpos"); + PyString string = extractPyString(ap, 0); + int start = ap.getInt(1, 0); + int end = ap.getInt(2, string.__len__()); + SRE_STATE state = new SRE_STATE(string.toString(), start, end, flags); - public MatchObject match(String string, int start) { - return match(string, start, Integer.MAX_VALUE); - } - - public MatchObject match(String string, int start, int end) { - SRE_STATE state = new SRE_STATE(string, start, end, flags); - state.ptr = state.start; int status = state.SRE_MATCH(code, 0, 1); return _pattern_new_match(state, string, status); } - - - - + public MatchObject search(PyObject[] args, String[] kws) { ArgParser ap = new ArgParser("search", args, kws, "pattern", "pos", "endpos"); - String string = ap.getString(0); + PyString string = extractPyString(ap, 0); int start = ap.getInt(1, 0); - int end = ap.getInt(2, string.length()); + int end = ap.getInt(2, string.__len__()); - SRE_STATE state = new SRE_STATE(string, start, end, flags); + SRE_STATE state = new SRE_STATE(string.toString(), start, end, flags); int status = state.SRE_SEARCH(code, 0); @@ -81,10 +75,9 @@ ArgParser ap = new ArgParser("sub", args, kws, "repl", "string", "count"); PyObject template = ap.getPyObject(0); - String string = ap.getString(1); int count = ap.getInt(2, 0); - return subx(template, string, count, false); + return subx(template, extractPyString(ap, 1), count, false); } @@ -93,16 +86,16 @@ ArgParser ap = new ArgParser("subn", args, kws, "repl", "string", "count"); PyObject template = ap.getPyObject(0); - String string = ap.getString(1); int count = ap.getInt(2, 0); - return subx(template, string, count, true); + return subx(template, extractPyString(ap, 1), count, true); } - private PyObject subx(PyObject template, String string, int count, + private PyObject subx(PyObject template, PyString instring, int count, boolean subn) { + String string = instring.toString(); PyObject filter = null; boolean filter_is_callable = false; if (template.isCallable()) { @@ -150,7 +143,7 @@ PyObject item; if (filter_is_callable) { /* pass match object through filter */ - MatchObject match = _pattern_new_match(state, string, 1); + MatchObject match = _pattern_new_match(state, instring, 1); item = filter.__call__(match); } else { item = filter; @@ -175,20 +168,20 @@ if (subn) return new PyTuple(new PyObject[] { - Py.newString(buf.toString()), Py.newInteger(n) + instring.createInstance(buf.toString()), Py.newInteger(n) }); else - return Py.newString(buf.toString()); + return instring.createInstance(buf.toString()); } public PyObject split(PyObject[] args, String[] kws) { ArgParser ap = new ArgParser("split", args, kws, "source", "maxsplit"); - String string = ap.getString(0); + PyString string = extractPyString(ap, 0); int maxsplit = ap.getInt(1, 0); - SRE_STATE state = new SRE_STATE(string, 0, Integer.MAX_VALUE, flags); + SRE_STATE state = new SRE_STATE(string.toString(), 0, Integer.MAX_VALUE, flags); PyList list = new PyList(); @@ -212,13 +205,13 @@ } /* get segment before this match */ - PyObject item = Py.newString(string.substring(last, state.start)); + PyObject item = string.__getslice__(Py.newInteger(last), Py.newInteger(state.start)); list.append(item); for (int i = 0; i < groups; i++) { - String s = state.getslice(i+1, string, false); + String s = state.getslice(i+1, string.toString(), false); if (s != null) - list.append(Py.newString(s)); + list.append(string.createInstance(s)); else list.append(Py.None); } @@ -226,8 +219,7 @@ last = state.start = state.ptr; } - PyObject item = Py.newString(string.substring(last, state.endpos)); - list.append(item); + list.append(string.__getslice__(Py.newInteger(last), Py.newInteger(state.endpos))); return list; } @@ -242,11 +234,11 @@ public PyObject findall(PyObject[] args, String[] kws) { ArgParser ap = new ArgParser("findall", args, kws, "source", "pos", "endpos"); - String string = ap.getString(0); + PyString string = extractPyString(ap, 0); int start = ap.getInt(1, 0); int end = ap.getInt(2, Integer.MAX_VALUE); - SRE_STATE state = new SRE_STATE(string, start, end, flags); + SRE_STATE state = new SRE_STATE(string.toString(), start, end, flags); Vector list = new Vector(); @@ -260,16 +252,15 @@ /* don't bother to build a match object */ switch (groups) { case 0: - item = Py.newString( - string.substring(state.start, state.ptr)); + item = string.__getslice__(Py.newInteger(state.start), Py.newInteger(state.ptr)); break; case 1: - item = Py.newString(state.getslice(1, string, true)); + item = string.createInstance(state.getslice(1, string.toString(), true)); break; default: PyObject[] t = new PyObject[groups]; for (int i = 0; i < groups; i++) - t[i] = Py.newString(state.getslice(i+1, string, true)); + t[i] = string.createInstance(state.getslice(i+1, string.toString(), true)); item = new PyTuple(t); break; } @@ -291,38 +282,29 @@ return new PyList(list); } - - public PyObject finditer(String string) { - return finditer(string, 0, Integer.MAX_VALUE); - } - - public PyObject finditer(String string, int start) { - return finditer(string, start, Integer.MAX_VALUE); - } - - public PyObject finditer(String string, int start, int end) { - ScannerObject scanner = scanner(string, start, end); + public PyObject finditer(PyObject[] args, String[] kws) { + ScannerObject scanner = scanner(args, kws); PyObject search = scanner.__findattr__("search"); return new PyCallIter(search, Py.None); } + + public ScannerObject scanner(PyObject[] args, String[] kws) { + ArgParser ap = new ArgParser("scanner", args, kws, + "pattern", "pos", "endpos"); + PyString string = extractPyString(ap, 0); - public ScannerObject scanner(String string) { - return scanner(string, 0, Integer.MAX_VALUE); - } - - public ScannerObject scanner(String string, int start) { - return scanner(string, start, Integer.MAX_VALUE); - } - - public ScannerObject scanner(String string, int start, int end) { ScannerObject self = new ScannerObject(); - self.state = new SRE_STATE(string, start, end, flags); + self.state = new SRE_STATE(string.toString(), + ap.getInt(1, 0), + ap.getInt(2, Integer.MAX_VALUE), + flags); self.pattern = this; self.string = string; return self; } + private void _error(int status) { if (status == SRE_STATE.SRE_ERROR_RECURSION_LIMIT) throw Py.RuntimeError("maximum recursion limit exceeded"); @@ -331,7 +313,7 @@ } - MatchObject _pattern_new_match(SRE_STATE state, String string, + MatchObject _pattern_new_match(SRE_STATE state, PyString string, int status) { /* create match object (from state object) */ @@ -374,6 +356,14 @@ _error(status); return null; } + + private static PyString extractPyString(ArgParser ap, int pos){ + PyObject obj = ap.getPyObject(pos); + if(!(obj instanceof PyString)){ + throw Py.TypeError("expected str or unicode but got " + obj.getType()); + } + return (PyString)ap.getPyObject(pos); + } } Modified: branches/2.3/src/org/python/modules/sre/ScannerObject.java =================================================================== --- branches/2.3/src/org/python/modules/sre/ScannerObject.java 2006-07-26 03:48:26 UTC (rev 2861) +++ branches/2.3/src/org/python/modules/sre/ScannerObject.java 2006-07-27 03:51:18 UTC (rev 2862) @@ -19,7 +19,7 @@ public class ScannerObject extends PyObject { public PatternObject pattern; - String string; + PyString string; SRE_STATE state; public MatchObject match() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2006-08-09 02:41:16
|
Revision: 2875 Author: cgroves Date: 2006-08-08 19:41:08 -0700 (Tue, 08 Aug 2006) ViewCVS: http://svn.sourceforge.net/jython/?rev=2875&view=rev Log Message: ----------- Catch StopIteration in PyGenerator and return null to fix bug #1331171. Also store StopIteration exceptions so PyIterator can throw the correct exception and preserve traceback linenumbers. Modified Paths: -------------- branches/2.3/src/org/python/core/PyCallIter.java branches/2.3/src/org/python/core/PyEnumerate.java branches/2.3/src/org/python/core/PyGenerator.java branches/2.3/src/org/python/core/PyIterator.java Modified: branches/2.3/src/org/python/core/PyCallIter.java =================================================================== --- branches/2.3/src/org/python/core/PyCallIter.java 2006-08-05 22:59:33 UTC (rev 2874) +++ branches/2.3/src/org/python/core/PyCallIter.java 2006-08-09 02:41:08 UTC (rev 2875) @@ -18,8 +18,10 @@ try { val = callable.__call__(); } catch (PyException exc) { - if (Py.matchException(exc, Py.StopIteration)) + if (Py.matchException(exc, Py.StopIteration)){ + stopException = exc; return null; + } throw exc; } if (val._eq(sentinel).__nonzero__()) Modified: branches/2.3/src/org/python/core/PyEnumerate.java =================================================================== --- branches/2.3/src/org/python/core/PyEnumerate.java 2006-08-05 22:59:33 UTC (rev 2874) +++ branches/2.3/src/org/python/core/PyEnumerate.java 2006-08-09 02:41:08 UTC (rev 2875) @@ -107,8 +107,12 @@ PyObject next_index; next_item = en_sit.__iternext__(); - if(next_item == null) + if(next_item == null){ + if(en_sit instanceof PyIterator && ((PyIterator)en_sit).stopException != null){ + stopException = ((PyIterator)en_sit).stopException; + } return null; + } next_index = new PyInteger((int)en_index); en_index++; Modified: branches/2.3/src/org/python/core/PyGenerator.java =================================================================== --- branches/2.3/src/org/python/core/PyGenerator.java 2006-08-05 22:59:33 UTC (rev 2874) +++ branches/2.3/src/org/python/core/PyGenerator.java 2006-08-09 02:41:08 UTC (rev 2875) @@ -39,6 +39,13 @@ PyObject result = null; try { result = gi_frame.f_code.call(gi_frame, closure); + } catch(PyException e) { + if(!e.type.equals(Py.StopIteration)) { + throw e; + }else{ + stopException = e; + return null; + } } finally { gi_running = false; } Modified: branches/2.3/src/org/python/core/PyIterator.java =================================================================== --- branches/2.3/src/org/python/core/PyIterator.java 2006-08-05 22:59:33 UTC (rev 2874) +++ branches/2.3/src/org/python/core/PyIterator.java 2006-08-09 02:41:08 UTC (rev 2875) @@ -3,10 +3,14 @@ package org.python.core; /** - * An abstract helper class usefull when implementing an iterator object. - * This implementation supply a correct __iter__() and a next() method - * based on the __iternext__() implementation. - * The __iternext__() method must be supplied by the subclass. + * An abstract helper class usefull when implementing an iterator object. This + * implementation supply a correct __iter__() and a next() method based on the + * __iternext__() implementation. The __iternext__() method must be supplied by + * the subclass. + * + * If the implementation raises a StopIteration exception, it should be stored + * in stopException so the correct exception can be thrown to preserve the line + * numbers in the traceback. */ public abstract class PyIterator extends PyObject { public PyObject __iter__() { @@ -19,10 +23,18 @@ public PyObject next() { PyObject ret = __iternext__(); - if (ret == null) + if(ret == null) { + if(stopException != null) { + PyException toThrow = stopException; + stopException = null; + throw toThrow; + } throw Py.StopIteration(""); + } return ret; } - + public abstract PyObject __iternext__(); + + protected PyException stopException; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2006-08-12 18:44:45
|
Revision: 2879 Author: cgroves Date: 2006-08-12 11:44:40 -0700 (Sat, 12 Aug 2006) ViewCVS: http://svn.sourceforge.net/jython/?rev=2879&view=rev Log Message: ----------- move java importation to a __classpath__ entry on sys.path from a metapath hook. This fixes bug #1246413 and bug #1421812 Modified Paths: -------------- branches/2.3/src/org/python/core/JavaImporter.java branches/2.3/src/org/python/core/PySystemState.java Modified: branches/2.3/src/org/python/core/JavaImporter.java =================================================================== --- branches/2.3/src/org/python/core/JavaImporter.java 2006-08-12 18:41:51 UTC (rev 2878) +++ branches/2.3/src/org/python/core/JavaImporter.java 2006-08-12 18:44:40 UTC (rev 2879) @@ -8,6 +8,13 @@ public JavaImporter() { super(); } + + public PyObject __call__(PyObject args[], String keywords[]) { + if(args[0].toString().endsWith("__classpath__")){ + return this; + } + throw Py.ImportError("unable to handle"); + } /** * Find the module for the fully qualified name. Modified: branches/2.3/src/org/python/core/PySystemState.java =================================================================== --- branches/2.3/src/org/python/core/PySystemState.java 2006-08-12 18:41:51 UTC (rev 2878) +++ branches/2.3/src/org/python/core/PySystemState.java 2006-08-12 18:44:40 UTC (rev 2879) @@ -232,11 +232,12 @@ argv = (PyList)defaultArgv.repeat(1); path = (PyList)defaultPath.repeat(1); + path.append(Py.newString("__classpath__")); meta_path = new PyList(); meta_path.append(new PrecompiledImporter()); - meta_path.append(new JavaImporter()); path_hooks = new PyList(); + path_hooks.append(new JavaImporter()); path_hooks.append(PyJavaClass.lookup(ZipFileImporter.class)); path_importer_cache = new PyDictionary(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2006-08-12 18:56:31
|
Revision: 2883 Author: cgroves Date: 2006-08-12 11:56:26 -0700 (Sat, 12 Aug 2006) ViewCVS: http://svn.sourceforge.net/jython/?rev=2883&view=rev Log Message: ----------- code cleanup and close open streams in finally Modified Paths: -------------- branches/2.3/src/org/python/core/SyspathJavaLoader.java branches/2.3/src/org/python/core/imp.java Modified: branches/2.3/src/org/python/core/SyspathJavaLoader.java =================================================================== --- branches/2.3/src/org/python/core/SyspathJavaLoader.java 2006-08-12 18:50:10 UTC (rev 2882) +++ branches/2.3/src/org/python/core/SyspathJavaLoader.java 2006-08-12 18:56:26 UTC (rev 2883) @@ -128,11 +128,17 @@ } try { byte[] buffer = FileUtil.readBytes(fis); - fis.close(); return loadClassFromBytes(name, buffer); - } catch (IOException e) { + } catch(IOException e) { continue; + } finally { + try { + fis.close(); + } catch(IOException e) { + continue; + } } + } } Modified: branches/2.3/src/org/python/core/imp.java =================================================================== --- branches/2.3/src/org/python/core/imp.java 2006-08-12 18:50:10 UTC (rev 2882) +++ branches/2.3/src/org/python/core/imp.java 2006-08-12 18:56:26 UTC (rev 2883) @@ -31,8 +31,12 @@ ; } + /** + * If the given name is found in sys.modules, the entry from there is + * returned. Otherwise a new PyModule is created for the name and added to + * sys.modules + */ public static PyModule addModule(String name) { - // System.err.println("AddModule:" + name); name = name.intern(); PyObject modules = Py.getSystemState().modules; PyModule module = (PyModule) modules.__finditem__(name); @@ -46,11 +50,15 @@ private static byte[] readBytes(InputStream fp) { try { - byte[] buf = FileUtil.readBytes(fp); - fp.close(); - return buf; - } catch (IOException ioe) { + return FileUtil.readBytes(fp); + } catch(IOException ioe) { throw Py.IOError(ioe); + } finally { + try { + fp.close(); + } catch(IOException e) { + throw Py.IOError(e); + } } } @@ -77,7 +85,6 @@ + APIVersion + ") in: " + name); } } - // System.err.println("APIVersion: "+api); PyCode code; try { code = BytecodeLoader.makeCode(name + "$py", data); @@ -98,29 +105,30 @@ return compileSource(name, file, null, null); } - public static byte[] compileSource(String name, File file, String filename, - String outFilename) { - if (filename == null) { - filename = file.toString(); + public static byte[] compileSource(String name, File file, String sourceFilename, + String compiledFilename) { + if (sourceFilename == null) { + sourceFilename = file.toString(); } - - if (outFilename == null) { - outFilename = filename.substring(0, filename.length() - 3) - + "$py.class"; + if (compiledFilename == null) { + compiledFilename = makeCompiledFilename(sourceFilename); } - - return compileSource(name, makeStream(file), filename, outFilename); + return compileSource(name, makeStream(file), sourceFilename, compiledFilename); } - static byte[] compileSource(String name, InputStream fp, String filename) { - String outFilename = null; - if (filename != null) { - outFilename = filename.substring(0, filename.length() - 3) - + "$py.class"; + static byte[] compileSource(String name, InputStream fp, String sourceFilename) { + String compiledFilename = null; + if (sourceFilename != null) { + compiledFilename = makeCompiledFilename(sourceFilename); } - return compileSource(name, fp, filename, outFilename); + return compileSource(name, fp, sourceFilename, compiledFilename); } + private static String makeCompiledFilename(String filename) { + return filename.substring(0, filename.length() - 3) + + "$py.class"; + } + static byte[] compileSource(String name, InputStream fp, String filename, String outFilename) { try { @@ -177,17 +185,14 @@ static PyObject createFromCode(String name, PyCode c) { PyModule module = addModule(name); - PyTableCode code = (PyTableCode)c; - try { - PyFrame f = new PyFrame(code, - module.__dict__, - module.__dict__, - null); - code.call(f); - } catch(RuntimeException t) { - Py.getSystemState().modules.__delitem__(name.intern()); - throw t; + + PyTableCode code = null; + if (c instanceof PyTableCode) { + code = (PyTableCode) c; } + PyFrame f = new PyFrame(code, module.__dict__, module.__dict__, null); + code.call(f); + return module; } @@ -199,9 +204,8 @@ if (interfaces[i] == PyRunnable.class) { // System.err.println("is runnable"); try { - PyObject o = createFromCode(name, ((PyRunnable) c - .newInstance()).getMain()); - return o; + return createFromCode(name, + ((PyRunnable)c.newInstance()).getMain()); } catch (InstantiationException e) { throw Py.JavaError(e); } catch (IllegalAccessException e) { @@ -504,7 +508,7 @@ return ret; } if (mod == null) { - ret = find_module(fullName, name, null); + ret = find_module(fullName.intern(), name, null); } else { ret = mod.impAttr(name.intern()); } @@ -590,7 +594,6 @@ StringBuffer parentNameBuffer = new StringBuffer( pkgMod != null ? pkgName : ""); PyObject topMod = import_next(pkgMod, parentNameBuffer, firstName); - if (topMod == Py.None || topMod == null) { if (topMod == null) { modules.__setitem__(parentNameBuffer.toString().intern(), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fwi...@us...> - 2006-11-27 02:30:52
|
Revision: 2995 http://svn.sourceforge.net/jython/?rev=2995&view=rev Author: fwierzbicki Date: 2006-11-26 18:30:51 -0800 (Sun, 26 Nov 2006) Log Message: ----------- merged fixes for bug 1603312 and 1603315 from trunk. Modified Paths: -------------- branches/2.3/src/org/python/core/PyInteger.java branches/2.3/src/org/python/core/PyString.java Modified: branches/2.3/src/org/python/core/PyInteger.java =================================================================== --- branches/2.3/src/org/python/core/PyInteger.java 2006-11-27 02:08:28 UTC (rev 2994) +++ branches/2.3/src/org/python/core/PyInteger.java 2006-11-27 02:30:51 UTC (rev 2995) @@ -1211,7 +1211,8 @@ return new PyIntegerDerived(subtype, ((PyInteger)intOrLong).getValue()); } else { - err_ovf("long int too large to convert to int"); + throw Py + .OverflowError("long int too large to convert to int"); } } if (!(x instanceof PyString)) { Modified: branches/2.3/src/org/python/core/PyString.java =================================================================== --- branches/2.3/src/org/python/core/PyString.java 2006-11-27 02:08:28 UTC (rev 2994) +++ branches/2.3/src/org/python/core/PyString.java 2006-11-27 02:30:51 UTC (rev 2995) @@ -2792,7 +2792,7 @@ final static PyObject str_new(PyNewWrapper new_, boolean init, PyType subtype, PyObject[] args, String[] keywords) { - ArgParser ap = new ArgParser("str", args, keywords, new String[] { "S" }, 0); + ArgParser ap = new ArgParser("str", args, keywords, new String[] { "object" }, 0); PyObject S = ap.getPyObject(0, null); if (new_.for_type == subtype) { return returnString(S); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <kz...@us...> - 2007-01-19 07:34:52
|
Revision: 3051 http://svn.sourceforge.net/jython/?rev=3051&view=rev Author: kzuberi Date: 2007-01-18 23:34:50 -0800 (Thu, 18 Jan 2007) Log Message: ----------- fixes from patch 1628469 by lantz moore, as per the patch comments: PyString __int__: don't overflow, return a long instead PyFloat _pow: ValueError when raising number to fractional power float___int__: don't overflow, return a long instead __builtin__ ord: TypeError if not a string or a string longer than 1 hex: TypeError when no conversion possible min: TypeError when zero args vars: TypeError when arg has no __dict__ Modified Paths: -------------- branches/2.3/src/org/python/core/PyFloat.java branches/2.3/src/org/python/core/PyString.java branches/2.3/src/org/python/core/__builtin__.java Modified: branches/2.3/src/org/python/core/PyFloat.java =================================================================== --- branches/2.3/src/org/python/core/PyFloat.java 2007-01-11 16:54:42 UTC (rev 3050) +++ branches/2.3/src/org/python/core/PyFloat.java 2007-01-19 07:34:50 UTC (rev 3051) @@ -1316,6 +1316,9 @@ return new PyFloat(0); } + if (value < 0 && iw != Math.floor(iw)) + throw Py.ValueError("negative number cannot be raised to a fractional power"); + double ret = Math.pow(value, iw); if (modulo == null) { return new PyFloat(ret); @@ -1359,11 +1362,11 @@ return float___int__(); } - final PyInteger float___int__() { + final PyObject float___int__() { if (value <= Integer.MAX_VALUE && value >= Integer.MIN_VALUE) { return new PyInteger((int)value); } - throw Py.OverflowError("float too large to convert"); + return __long__(); } public PyLong __long__() { Modified: branches/2.3/src/org/python/core/PyString.java =================================================================== --- branches/2.3/src/org/python/core/PyString.java 2007-01-11 16:54:42 UTC (rev 3050) +++ branches/2.3/src/org/python/core/PyString.java 2007-01-19 07:34:50 UTC (rev 3051) @@ -3416,7 +3416,16 @@ } public PyObject __int__() { - return Py.newInteger(atoi(10)); + try + { + return Py.newInteger(atoi(10)); + } + catch (PyException e) + { + if (Py.matchException(e, Py.ValueError)) + return atol(10); + throw e; + } } public PyLong __long__() { Modified: branches/2.3/src/org/python/core/__builtin__.java =================================================================== --- branches/2.3/src/org/python/core/__builtin__.java 2007-01-11 16:54:42 UTC (rev 3050) +++ branches/2.3/src/org/python/core/__builtin__.java 2007-01-19 07:34:50 UTC (rev 3051) @@ -32,6 +32,10 @@ return __builtin__.range(Py.py2int(arg1, "range(): 1st arg can't be coerced to int")); case 3: + if (!(arg1 instanceof PyString)) + throw Py.TypeError("ord() expected string of length 1, but " + arg1.getType().getFullName() + " found"); + if (arg1.__len__() > 1) + throw Py.TypeError("ord() expected a character, but string of length " + arg1.__len__() + " found"); return Py.newInteger(__builtin__.ord(Py.py2char(arg1, "ord(): 1st arg can't be coerced to char"))); case 5: @@ -398,7 +402,13 @@ } public static PyString hex(PyObject o) { - return o.__hex__(); + try { + return o.__hex__(); + } catch (PyException e) { + if (Py.matchException(e, Py.AttributeError)) + throw Py.TypeError("hex() argument can't be converted to hex"); + throw e; + } } public static long id(PyObject o) { @@ -533,6 +543,9 @@ } public static PyObject min(PyObject[] l) { + if (l.length == 0) { + throw Py.TypeError("min expected 1 arguments, got 0"); + } if (l.length == 1) { return min(l[0]); } @@ -852,7 +865,13 @@ } public static PyObject vars(PyObject o) { - return o.__getattr__("__dict__"); + try { + return o.__getattr__("__dict__"); + } catch (PyException e) { + if (Py.matchException(e, Py.AttributeError)) + throw Py.TypeError("vars() argument must have __dict__ attribute"); + throw e; + } } public static PyObject vars() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2007-02-22 05:08:45
|
Revision: 3113 http://svn.sourceforge.net/jython/?rev=3113&view=rev Author: cgroves Date: 2007-02-21 21:08:42 -0800 (Wed, 21 Feb 2007) Log Message: ----------- merged r2999 from trunk Modified Paths: -------------- branches/2.3/src/org/python/core/PyList.java branches/2.3/src/org/python/core/PyTuple.java branches/2.3/src/org/python/core/PyUnicode.java Modified: branches/2.3/src/org/python/core/PyList.java =================================================================== --- branches/2.3/src/org/python/core/PyList.java 2007-02-20 07:55:39 UTC (rev 3112) +++ branches/2.3/src/org/python/core/PyList.java 2007-02-22 05:08:42 UTC (rev 3113) @@ -1098,20 +1098,17 @@ } final void list_init(PyObject[] args,String[] kwds) { - int nargs = args.length - kwds.length; - if (nargs > 1) { - throw PyBuiltinFunction.DefaultInfo.unexpectedCall(nargs,false,exposed_name,0,1); - } - if (nargs == 0) { + ArgParser ap = new ArgParser("list", args, kwds, new String[] { "sequence"}, 0); + PyObject seq = ap.getPyObject(0, null); + if (seq == null) { return; } - PyObject o = args[0]; - if (o instanceof PySequenceList) { - PySequenceList p = (PySequenceList) o.__getslice__(Py.None, Py.None, Py.One); + if (seq instanceof PySequenceList) { + PySequenceList p = (PySequenceList) seq.__getslice__(Py.None, Py.None, Py.One); this.list = p.list; } else { - PyObject iter = o.__iter__(); + PyObject iter = seq.__iter__(); for (PyObject item = null; (item = iter.__iternext__()) != null; ) { append(item); } Modified: branches/2.3/src/org/python/core/PyTuple.java =================================================================== --- branches/2.3/src/org/python/core/PyTuple.java 2007-02-20 07:55:39 UTC (rev 3112) +++ branches/2.3/src/org/python/core/PyTuple.java 2007-02-22 05:08:42 UTC (rev 3113) @@ -416,7 +416,7 @@ final static PyObject tuple_new(PyNewWrapper new_, boolean init, PyType subtype, PyObject[] args, String[] keywords) { - ArgParser ap = new ArgParser("tuple", args, keywords, new String[] { "S" }, 0); + ArgParser ap = new ArgParser("tuple", args, keywords, new String[] { "sequence" }, 0); PyObject S = ap.getPyObject(0, null); if (new_.for_type == subtype) { if (S == null) { Modified: branches/2.3/src/org/python/core/PyUnicode.java =================================================================== --- branches/2.3/src/org/python/core/PyUnicode.java 2007-02-20 07:55:39 UTC (rev 3112) +++ branches/2.3/src/org/python/core/PyUnicode.java 2007-02-22 05:08:42 UTC (rev 3113) @@ -2727,10 +2727,15 @@ this(UNICODETYPE,String.valueOf(c)); } - final static PyObject unicode_new(PyNewWrapper new_, boolean init, - PyType subtype, PyObject[] args, String[] keywords) { - ArgParser ap = new ArgParser("unicode", args, keywords, - new String[] { "S", "encoding", "errors" }, 0); + final static PyObject unicode_new(PyNewWrapper new_, boolean init, PyType subtype, + PyObject[] args, String[] keywords) { + ArgParser ap = new ArgParser("unicode", + args, + keywords, + new String[] {"string", + "encoding", + "errors"}, + 0); PyObject S = ap.getPyObject(0, null); String encoding = ap.getString(1, null); String errors = ap.getString(2, null); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2007-02-22 05:23:40
|
Revision: 3115 http://svn.sourceforge.net/jython/?rev=3115&view=rev Author: cgroves Date: 2007-02-21 21:23:37 -0800 (Wed, 21 Feb 2007) Log Message: ----------- merged r3021,3022 from trunk Modified Paths: -------------- branches/2.3/src/org/python/core/PyStringMap.java branches/2.3/src/org/python/core/ZipFileImporter.java Modified: branches/2.3/src/org/python/core/PyStringMap.java =================================================================== --- branches/2.3/src/org/python/core/PyStringMap.java 2007-02-22 05:21:12 UTC (rev 3114) +++ branches/2.3/src/org/python/core/PyStringMap.java 2007-02-22 05:23:37 UTC (rev 3115) @@ -560,13 +560,27 @@ } return l; } - + /** * return an iterator over (key, value) pairs */ public synchronized PyObject iteritems() { return new PyStringMapIter(keys, values, PyStringMapIter.ITEMS); } + + /** + * return an iterator over the keys + */ + public synchronized PyObject iterkeys() { + return new PyStringMapIter(keys, values, PyStringMapIter.KEYS); + } + + /** + * return an iterator over the values + */ + public synchronized PyObject itervalues() { + return new PyStringMapIter(keys, values, PyStringMapIter.VALUES); + } } /* extended, based on PyDictionaryIter */ @@ -613,7 +627,6 @@ } return null; } - } Modified: branches/2.3/src/org/python/core/ZipFileImporter.java =================================================================== --- branches/2.3/src/org/python/core/ZipFileImporter.java 2007-02-22 05:21:12 UTC (rev 3114) +++ branches/2.3/src/org/python/core/ZipFileImporter.java 2007-02-22 05:23:37 UTC (rev 3115) @@ -122,7 +122,9 @@ info = new ZipModuleInfo(zipArchive, compiledEntry, true); } } - info = new ZipModuleInfo(zipArchive, sourceEntry, false); + if (info == null) { + info = new ZipModuleInfo(zipArchive, sourceEntry, false); + } } if (pkg && info != null) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2007-07-15 08:26:12
|
Revision: 3305 http://svn.sourceforge.net/jython/?rev=3305&view=rev Author: cgroves Date: 2007-07-15 01:26:10 -0700 (Sun, 15 Jul 2007) Log Message: ----------- Remove support for ancient JVMs in IdImpl1 and move IdImpl2 into IdImpl as the default Modified Paths: -------------- branches/2.3/src/org/python/core/IdImpl.java branches/2.3/src/org/python/core/Py.java Removed Paths: ------------- branches/2.3/src/org/python/core/IdImpl1.java branches/2.3/src/org/python/core/IdImpl2.java Modified: branches/2.3/src/org/python/core/IdImpl.java =================================================================== --- branches/2.3/src/org/python/core/IdImpl.java 2007-07-15 08:23:52 UTC (rev 3304) +++ branches/2.3/src/org/python/core/IdImpl.java 2007-07-15 08:26:10 UTC (rev 3305) @@ -1,26 +1,91 @@ package org.python.core; -public abstract class IdImpl { +import java.lang.ref.ReferenceQueue; +import java.lang.ref.WeakReference; +import java.util.HashMap; - public static IdImpl getInstance() { - if (System.getProperty("java.version").compareTo("1.2") >= 0) { - try { - return (IdImpl) Class.forName("org.python.core.IdImpl2") - .newInstance(); - } catch (Throwable e) { - return null; +public class IdImpl { + + public static class WeakIdentityMap { + + private ReferenceQueue refqueue = new ReferenceQueue(); + private HashMap hashmap = new HashMap(); + + private void cleanup() { + Object k; + while ((k = this.refqueue.poll()) != null) { + this.hashmap.remove(k); } - } else { - return new IdImpl1(); } + + private class WeakIdKey extends WeakReference { + private int hashcode; + + WeakIdKey(Object obj) { + super(obj,WeakIdentityMap.this.refqueue); + this.hashcode = System.identityHashCode(obj); + } + + public int hashCode() { + return this.hashcode; + } + + public boolean equals(Object other) { + Object obj = this.get(); + if (obj != null) { + return obj == ((WeakIdKey)other).get(); + } else { + return this == other; + } + } + } + + public int _internal_map_size() { + return this.hashmap.size(); + } + + public void put(Object key,Object val) { + cleanup(); + this.hashmap.put(new WeakIdKey(key),val); + } + + public Object get(Object key) { + cleanup(); + return this.hashmap.get(new WeakIdKey(key)); + } + public void remove(Object key) { + cleanup(); + this.hashmap.remove(new WeakIdKey(key)); + } + } - public abstract long id(PyObject o); + private WeakIdentityMap id_map = new WeakIdentityMap(); + private long sequential_id = 0; - public abstract String idstr(PyObject o); + public long id(PyObject o) { + if (o instanceof PyJavaInstance) { + return java_obj_id(((PyJavaInstance)o).javaProxy); + } else { + return java_obj_id(o); + } + } - // o should not be an instance of a subclass of PyObject - public abstract long java_obj_id(Object o); + // XXX maybe should display both this id and identityHashCode + // XXX preserve the old "at ###" style? + public String idstr(PyObject o) { + return Long.toString(id(o)); + } + public synchronized long java_obj_id(Object o) { + Long cand = (Long)this.id_map.get(o); + if (cand == null) { + this.sequential_id++; + long new_id = this.sequential_id; + this.id_map.put(o,new Long(new_id)); + return new_id; + } + return cand.longValue(); + } } Deleted: branches/2.3/src/org/python/core/IdImpl1.java =================================================================== --- branches/2.3/src/org/python/core/IdImpl1.java 2007-07-15 08:23:52 UTC (rev 3304) +++ branches/2.3/src/org/python/core/IdImpl1.java 2007-07-15 08:26:10 UTC (rev 3305) @@ -1,26 +0,0 @@ -package org.python.core; - -/** - * - * @deprecated Java1 no longer supported. - * - */ -public class IdImpl1 extends IdImpl { - - public long id(PyObject o) { - if (o instanceof PyJavaInstance) { - return System.identityHashCode(((PyJavaInstance) o).javaProxy); - } else { - return System.identityHashCode(o); - } - } - - public String idstr(PyObject o) { - return Long.toString(id(o)); - } - - public long java_obj_id(Object o) { - return System.identityHashCode(o); - } - -} Deleted: branches/2.3/src/org/python/core/IdImpl2.java =================================================================== --- branches/2.3/src/org/python/core/IdImpl2.java 2007-07-15 08:23:52 UTC (rev 3304) +++ branches/2.3/src/org/python/core/IdImpl2.java 2007-07-15 08:26:10 UTC (rev 3305) @@ -1,92 +0,0 @@ -package org.python.core; - -import java.lang.ref.WeakReference; -import java.lang.ref.ReferenceQueue; -import java.util.HashMap; - -public class IdImpl2 extends IdImpl { - - public static class WeakIdentityMap { - - private ReferenceQueue refqueue = new ReferenceQueue(); - private HashMap hashmap = new HashMap(); - - private void cleanup() { - Object k; - while ((k = this.refqueue.poll()) != null) { - this.hashmap.remove(k); - } - } - - private class WeakIdKey extends WeakReference { - private int hashcode; - - WeakIdKey(Object obj) { - super(obj,WeakIdentityMap.this.refqueue); - this.hashcode = System.identityHashCode(obj); - } - - public int hashCode() { - return this.hashcode; - } - - public boolean equals(Object other) { - Object obj = this.get(); - if (obj != null) { - return obj == ((WeakIdKey)other).get(); - } else { - return this == other; - } - } - } - - public int _internal_map_size() { - return this.hashmap.size(); - } - - public void put(Object key,Object val) { - cleanup(); - this.hashmap.put(new WeakIdKey(key),val); - } - - public Object get(Object key) { - cleanup(); - return this.hashmap.get(new WeakIdKey(key)); - } - - public void remove(Object key) { - cleanup(); - this.hashmap.remove(new WeakIdKey(key)); - } - - } - - private WeakIdentityMap id_map = new WeakIdentityMap(); - private long sequential_id = 0; - - public long id(PyObject o) { - if (o instanceof PyJavaInstance) { - return java_obj_id(((PyJavaInstance)o).javaProxy); - } else { - return java_obj_id(o); - } - } - - // XXX maybe should display both this id and identityHashCode - // XXX preserve the old "at ###" style? - public String idstr(PyObject o) { - return Long.toString(id(o)); - } - - public synchronized long java_obj_id(Object o) { - Long cand = (Long)this.id_map.get(o); - if (cand == null) { - this.sequential_id++; - long new_id = this.sequential_id; - this.id_map.put(o,new Long(new_id)); - return new_id; - } - return cand.longValue(); - } - -} Modified: branches/2.3/src/org/python/core/Py.java =================================================================== --- branches/2.3/src/org/python/core/Py.java 2007-07-15 08:23:52 UTC (rev 3304) +++ branches/2.3/src/org/python/core/Py.java 2007-07-15 08:26:10 UTC (rev 3305) @@ -1828,7 +1828,7 @@ } } - private static IdImpl idimpl = IdImpl.getInstance(); + private static IdImpl idimpl = new IdImpl(); public static long id(PyObject o) { return idimpl.id(o); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2007-07-15 09:09:13
|
Revision: 3308 http://svn.sourceforge.net/jython/?rev=3308&view=rev Author: cgroves Date: 2007-07-15 02:09:11 -0700 (Sun, 15 Jul 2007) Log Message: ----------- Remove support for ancient JVMs by removing InternalTables1 and moving InternalTables2 into InternalTables as the default Modified Paths: -------------- branches/2.3/src/org/python/core/AutoInternalTables.java branches/2.3/src/org/python/core/InternalTables.java Removed Paths: ------------- branches/2.3/src/org/python/core/InternalTables1.java branches/2.3/src/org/python/core/InternalTables2.java Modified: branches/2.3/src/org/python/core/AutoInternalTables.java =================================================================== --- branches/2.3/src/org/python/core/AutoInternalTables.java 2007-07-15 08:29:58 UTC (rev 3307) +++ branches/2.3/src/org/python/core/AutoInternalTables.java 2007-07-15 09:09:11 UTC (rev 3308) @@ -2,10 +2,11 @@ package org.python.core; -import java.lang.ref.*; -import java.util.*; +import java.lang.ref.Reference; +import java.lang.ref.ReferenceQueue; +import java.util.Map; -public abstract class AutoInternalTables extends InternalTables2 { +public abstract class AutoInternalTables extends InternalTables { protected ReferenceQueue queue = new ReferenceQueue(); Modified: branches/2.3/src/org/python/core/InternalTables.java =================================================================== --- branches/2.3/src/org/python/core/InternalTables.java 2007-07-15 08:29:58 UTC (rev 3307) +++ branches/2.3/src/org/python/core/InternalTables.java 2007-07-15 09:09:11 UTC (rev 3308) @@ -2,23 +2,22 @@ package org.python.core; +import java.lang.ref.WeakReference; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.StringTokenizer; +import java.util.WeakHashMap; + import org.python.core.packagecache.PackageManager; -import java.util.StringTokenizer; +public class InternalTables { -public abstract class InternalTables { - // x__ --> org.python.core.X__InternalTables // (x|X)__> --> org.python.core.X__InternalTables // >(x|X)__ --> org.python.core.InternalTablesX__ // other (X__|__.__) --> other // - /** - * XXX: These contortions are here to decide between InternalTables1 and - * InternalTables2. Since we have deprecated support for JDK 1.1 -- this - * should go away and InternalTables1 and InternalTables2 should be merged - * and replace this class. - */ static private InternalTables tryImpl(String id) { try { if (id.indexOf('.') < 0) { @@ -64,18 +63,10 @@ + "You need to call PySystemState.initialize or " + "PythonInterpreter.initialize."); } - String cands = registry - .getProperty("python.options.internalTablesImpl"); + String cands = registry.getProperty("python.options.internalTablesImpl"); if (cands == null) { - String version = System.getProperty("java.version"); - if (version.compareTo("1.2") >= 0) { - cands = ">2:>1"; - } else { - cands = ">1"; - } - } else { - cands = cands + ":>2:>1"; - } + return new InternalTables(); + } StringTokenizer candEnum = new StringTokenizer(cands, ":"); while (candEnum.hasMoreTokens()) { InternalTables tbl = tryImpl(candEnum.nextToken().trim()); @@ -83,48 +74,228 @@ return tbl; } } - return null; // XXX: never reached -- throw exception instead? + return new InternalTables(); } + + final protected static short JCLASS = 0; - protected abstract boolean queryCanonical(String name); + final protected static short LAZY_JCLASS = 1; - protected abstract PyJavaClass getCanonical(Class c); + final protected static short ADAPTER_CLASS = 2; - protected abstract PyJavaClass getLazyCanonical(String name); + final protected static short ADAPTER = 3; - protected abstract void putCanonical(Class c, PyJavaClass canonical); + protected Map classes = new HashMap(); - protected abstract void putLazyCanonical(String name, PyJavaClass canonical); + protected Map temp = new HashMap();; - protected abstract Class getAdapterClass(Class c); + protected Map counters = new HashMap();; - protected abstract void putAdapterClass(Class c, Class ac); + protected Map lazyClasses = new HashMap();; - protected abstract Object getAdapter(Object o, String evc); + protected Map adapterClasses = new HashMap();; - protected abstract void putAdapter(Object o, String evc, Object ad); + protected final short GSTABLE = 1; - public boolean _doesSomeAutoUnload() { - return false; + protected final short JCSTABLE = 2; + + protected short keepstable; + + protected void commitTemp() { + this.classes.putAll(this.temp); + this.temp.clear(); } - public void _forceCleanup() { + protected WeakHashMap adapters = new WeakHashMap();; + + protected Object getAdapter(Object o,String evc) { + HashMap ads = (HashMap)this.adapters.get(o); + if (ads == null) { + return null; + } + WeakReference adw = (WeakReference) ads.get(evc); + if (adw == null){ + return null; + } + return adw.get(); } - public abstract void _beginCanonical(); + protected void putAdapter(Object o,String evc,Object ad) { + HashMap ads = (HashMap)this.adapters.get(o); + if (ads == null) { + ads = new HashMap(); + this.adapters.put(o,ads); + } + ads.put(evc,new WeakReference(ad)); + } - public abstract void _beginLazyCanonical(); + protected Iterator iter; + protected Iterator grand; + protected short iterType; + protected Object cur; - public abstract void _beginOverAdapterClasses(); + protected void beginStable(short lvl) { + this.keepstable = lvl; + } - public abstract void _beginOverAdapters(); + protected void endStable() { + if (this.keepstable == this.JCSTABLE) + commitTemp(); + this.keepstable = 0; + } - public abstract Object _next(); + protected void classesPut(Class c, Object jc) { + if (this.keepstable == this.JCSTABLE) { + this.temp.put(c, jc); + // System.err.println("temp-defer-canonical: "+c.getName()); + } else { + this.classes.put(c, jc); + } + String name = c.getName(); + Integer cnt = (Integer) this.counters.get(name); + if (cnt == null) { + this.counters.put(name, new Integer(1)); + this.lazyClasses.remove(name); + } else { + this.counters.put(name, new Integer(cnt.intValue() + 1)); + } + } - public abstract void _flushCurrent(); + protected Object classesGet(Class c) { + Object o = this.classes.get(c); + if (o != null || this.keepstable != this.JCSTABLE) + return o; + return this.temp.get(c); + } - public abstract void _flush(PyJavaClass jc); + public void _beginCanonical() { + beginStable(this.JCSTABLE); + this.iter = this.classes.values().iterator(); + this.iterType = JCLASS; + } + public void _beginLazyCanonical() { + beginStable(this.GSTABLE); + this.iter = this.lazyClasses.values().iterator(); + this.iterType = LAZY_JCLASS; + } + + public void _beginOverAdapterClasses() { + beginStable(this.GSTABLE); + this.iter = this.adapterClasses.entrySet().iterator(); + this.iterType = ADAPTER_CLASS; + + } + + public void _beginOverAdapters() { + beginStable((short)0); + this.grand = this.adapters.values().iterator(); + this.iter = null; + this.iterType = ADAPTER; + } + + public Object _next() { + if (this.iterType == ADAPTER) { + for(;;) { + if (this.iter==null || !this.iter.hasNext() ) { + if (this.grand.hasNext()) { + this.cur = this.grand.next(); + this.iter = ((HashMap)this.cur).values().iterator(); + } else { + this.iter = null; + } + } + if (this.iter != null) { + WeakReference adw = (WeakReference)this.iter.next(); + Object ad = adw.get(); + if (ad != null) { + return ad.getClass().getInterfaces()[0]; + } + else { + continue; + } + } + this.grand = null; + break; + } + } + else if (this.iter.hasNext()) { + this.cur = this.iter.next(); + switch(this.iterType) { + case JCLASS: + return this.cur; + case LAZY_JCLASS: + PyJavaClass lazy = (PyJavaClass)this.cur; + return new _LazyRep(lazy.__name__,lazy.__mgr__); + case ADAPTER_CLASS: + Map.Entry entry = (Map.Entry)this.cur; + return entry.getKey(); + } + } + this.cur = null; + endStable(); + this.iter = null; + return null; + } + + public void _flushCurrent() { + this.iter.remove(); + switch(this.iterType) { + case JCLASS: + classesDec(((PyJavaClass)this.cur).__name__); + break; + case ADAPTER: + if (((HashMap)this.cur).size() == 0) this.grand.remove(); + } + } + + public void _flush(PyJavaClass jc) { + Class c = jc.proxyClass; + if (c == null) { + this.lazyClasses.remove(jc.__name__); + } else { + this.classes.remove(c); + classesDec(jc.__name__); + } + } + + protected Class getAdapterClass(Class c) { + return (Class) this.adapterClasses.get(c); + } + + protected PyJavaClass getCanonical(Class c) { + return (PyJavaClass) classesGet(c); + } + + protected PyJavaClass getLazyCanonical(String name) { + return (PyJavaClass) this.lazyClasses.get(name); + } + + protected void putAdapterClass(Class c, Class ac) { + this.adapterClasses.put(c, ac); + } + + protected void putCanonical(Class c, PyJavaClass canonical) { + classesPut(c, canonical); + } + + protected void putLazyCanonical(String name, PyJavaClass canonical) { + this.lazyClasses.put(name, canonical); + } + + protected boolean queryCanonical(String name) { + return this.counters.get(name) != null + || this.lazyClasses.get(name) != null; + } + + protected void classesDec(String name) { + int c = ((Integer) this.counters.get(name)).intValue(); + if (c == 1) + this.counters.remove(name); + else + this.counters.put(name, new Integer(c - 1)); + } + static public class _LazyRep { public String name; Deleted: branches/2.3/src/org/python/core/InternalTables1.java =================================================================== --- branches/2.3/src/org/python/core/InternalTables1.java 2007-07-15 08:29:58 UTC (rev 3307) +++ branches/2.3/src/org/python/core/InternalTables1.java 2007-07-15 09:09:11 UTC (rev 3308) @@ -1,225 +0,0 @@ -// Copyright 2000 Samuele Pedroni - -package org.python.core; - -import java.util.*; - -/** - * - * @deprecated Java1 no longer supported. - * - */ -public class InternalTables1 extends InternalTables { - - protected static interface Table { - public Object put(Object key, Object obj); - - public Object get(Object key); - - public Object remove(Object key); - - public void clear(); - } - - private static class TableProvid1 extends Hashtable implements Table { - } - - final protected static short JCLASS = 0; - - final protected static short LAZY_JCLASS = 1; - - final protected static short ADAPTER_CLASS = 2; - - final protected static short ADAPTER = 3; - - protected Table classes; - - protected Table temp; - - protected Table counters; - - protected Table lazyClasses; - - protected Table adapterClasses; - - protected final short GSTABLE = 1; - - protected final short JCSTABLE = 2; - - protected short keepstable; - - protected void beginStable(short lvl) { - this.keepstable = lvl; - } - - protected void classesPut(Class c, Object jc) { - if (this.keepstable == this.JCSTABLE) { - this.temp.put(c, jc); - // System.err.println("temp-defer-canonical: "+c.getName()); - } else { - this.classes.put(c, jc); - } - String name = c.getName(); - Integer cnt = (Integer) this.counters.get(name); - if (cnt == null) { - this.counters.put(name, new Integer(1)); - this.lazyClasses.remove(name); - } else { - this.counters.put(name, new Integer(cnt.intValue() + 1)); - } - } - - protected Object classesGet(Class c) { - Object o = this.classes.get(c); - if (o != null || this.keepstable != this.JCSTABLE) - return o; - return this.temp.get(c); - } - - protected void endStable() { - if (this.keepstable == this.JCSTABLE) - commitTemp(); - this.keepstable = 0; - } - - protected void classesDec(String name) { - int c = ((Integer) this.counters.get(name)).intValue(); - if (c == 1) - this.counters.remove(name); - else - this.counters.put(name, new Integer(c - 1)); - } - - protected void commitTemp() { - for (Enumeration e = ((Hashtable) this.temp).keys(); e - .hasMoreElements();) { - Object c = e.nextElement(); - this.classes.put(c, this.temp.get(c)); - } - this.temp.clear(); - } - - protected boolean queryCanonical(String name) { - return this.counters.get(name) != null - || this.lazyClasses.get(name) != null; - } - - protected PyJavaClass getCanonical(Class c) { - return (PyJavaClass) classesGet(c); - } - - protected PyJavaClass getLazyCanonical(String name) { - return (PyJavaClass) this.lazyClasses.get(name); - } - - protected void putCanonical(Class c, PyJavaClass canonical) { - classesPut(c, canonical); - } - - protected void putLazyCanonical(String name, PyJavaClass canonical) { - this.lazyClasses.put(name, canonical); - } - - protected Class getAdapterClass(Class c) { - return (Class) this.adapterClasses.get(c); - } - - protected void putAdapterClass(Class c, Class ac) { - this.adapterClasses.put(c, ac); - } - - private Hashtable adapters; - - protected Object getAdapter(Object o, String evc) { - return this.adapters.get(evc + '$' + System.identityHashCode(o)); - } - - protected void putAdapter(Object o, String evc, Object ad) { - this.adapters.put(evc + '$' + System.identityHashCode(o), ad); - } - - protected short iterType; - - protected Object cur; - - private Enumeration enumm; - - private Hashtable enumTable; - - public void _beginCanonical() { - beginStable(this.JCSTABLE); - this.enumm = ((TableProvid1) this.classes).keys(); - this.enumTable = (TableProvid1) this.classes; - this.iterType = JCLASS; - } - - public void _beginLazyCanonical() { - this.enumm = ((TableProvid1) this.lazyClasses).keys(); - this.enumTable = (TableProvid1) this.lazyClasses; - this.iterType = LAZY_JCLASS; - } - - public void _beginOverAdapterClasses() { - this.enumm = ((TableProvid1) this.adapterClasses).keys(); - this.enumTable = (TableProvid1) this.adapterClasses; - this.iterType = ADAPTER_CLASS; - - } - - public void _beginOverAdapters() { - this.enumm = this.adapters.keys(); - this.enumTable = this.adapters; - this.iterType = ADAPTER; - } - - public Object _next() { - if (this.enumm.hasMoreElements()) { - this.cur = this.enumm.nextElement(); - switch (this.iterType) { - case JCLASS: - return (PyJavaClass) this.classes.get(this.cur); - case LAZY_JCLASS: - PyJavaClass lazy = (PyJavaClass) this.lazyClasses.get(this.cur); - return new _LazyRep(lazy.__name__, lazy.__mgr__); - case ADAPTER_CLASS: - return this.cur; - case ADAPTER: - return this.adapters.get(this.cur).getClass().getInterfaces()[0]; - } - } - this.cur = null; - this.enumm = null; - endStable(); - return null; - } - - public void _flushCurrent() { - this.enumTable.remove(this.cur); - if (this.iterType == JCLASS) - classesDec(((Class) this.cur).getName()); - } - - public void _flush(PyJavaClass jc) { - Class c = jc.proxyClass; - if (c == null) { - this.lazyClasses.remove(jc.__name__); - } else { - this.classes.remove(c); - classesDec(jc.__name__); - } - } - - protected InternalTables1(boolean fake) { - } - - public InternalTables1() { - this.classes = new TableProvid1(); - this.temp = new TableProvid1(); - this.counters = new TableProvid1(); - this.lazyClasses = new TableProvid1(); - - this.adapterClasses = new TableProvid1(); - - this.adapters = new Hashtable(); - } -} Deleted: branches/2.3/src/org/python/core/InternalTables2.java =================================================================== --- branches/2.3/src/org/python/core/InternalTables2.java 2007-07-15 08:29:58 UTC (rev 3307) +++ branches/2.3/src/org/python/core/InternalTables2.java 2007-07-15 09:09:11 UTC (rev 3308) @@ -1,137 +0,0 @@ -// Copyright 2000 Samuele Pedroni - -package org.python.core; - -import java.util.*; -import java.lang.ref.*; - -public class InternalTables2 extends InternalTables1 { - - protected static class TableProvid2 extends HashMap implements Table { - } - - protected void commitTemp() { - ((TableProvid2)this.classes).putAll((TableProvid2)this.temp); - this.temp.clear(); - } - - protected WeakHashMap adapters; - - protected Object getAdapter(Object o,String evc) { - HashMap ads = (HashMap)this.adapters.get(o); - if (ads == null) { - return null; - } - WeakReference adw = (WeakReference) ads.get(evc); - if (adw == null){ - return null; - } - return adw.get(); - } - - protected void putAdapter(Object o,String evc,Object ad) { - HashMap ads = (HashMap)this.adapters.get(o); - if (ads == null) { - ads = new HashMap(); - this.adapters.put(o,ads); - } - ads.put(evc,new WeakReference(ad)); - } - - protected Iterator iter; - protected Iterator grand; - - public void _beginCanonical() { - beginStable(this.JCSTABLE); - this.iter = ((TableProvid2)this.classes).values().iterator(); - this.iterType = JCLASS; - } - - public void _beginLazyCanonical() { - beginStable(this.GSTABLE); - this.iter = ((TableProvid2)this.lazyClasses).values().iterator(); - this.iterType = LAZY_JCLASS; - } - - public void _beginOverAdapterClasses() { - beginStable(this.GSTABLE); - this.iter = ((TableProvid2)this.adapterClasses).entrySet().iterator(); - this.iterType = ADAPTER_CLASS; - - } - - public void _beginOverAdapters() { - beginStable((short)0); - this.grand = this.adapters.values().iterator(); - this.iter = null; - this.iterType = ADAPTER; - } - - public Object _next() { - if (this.iterType == ADAPTER) { - for(;;) { - if (this.iter==null || !this.iter.hasNext() ) { - if (this.grand.hasNext()) { - this.cur = this.grand.next(); - this.iter = ((HashMap)this.cur).values().iterator(); - } else { - this.iter = null; - } - } - if (this.iter != null) { - WeakReference adw = (WeakReference)this.iter.next(); - Object ad = adw.get(); - if (ad != null) { - return ad.getClass().getInterfaces()[0]; - } - else { - continue; - } - } - this.grand = null; - break; - } - } - else if (this.iter.hasNext()) { - this.cur = this.iter.next(); - switch(this.iterType) { - case JCLASS: - return (PyJavaClass)this.cur; - case LAZY_JCLASS: - PyJavaClass lazy = (PyJavaClass)this.cur; - return new _LazyRep(lazy.__name__,lazy.__mgr__); - case ADAPTER_CLASS: - Map.Entry entry = (Map.Entry)this.cur; - return entry.getKey(); - } - } - this.cur = null; - endStable(); - this.iter = null; - return null; - } - - public void _flushCurrent() { - this.iter.remove(); - switch(this.iterType) { - case JCLASS: - classesDec(((PyJavaClass)this.cur).__name__); - break; - case ADAPTER: - if (((HashMap)this.cur).size() == 0) this.grand.remove(); - } - } - - public InternalTables2() { - super(true); - - this.classes = new TableProvid2(); - this.temp = new TableProvid2(); - this.counters = new TableProvid2(); - this.lazyClasses = new TableProvid2(); - - this.adapterClasses = new TableProvid2(); - - this.adapters = new WeakHashMap(); - } -} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2007-07-15 09:26:56
|
Revision: 3310 http://svn.sourceforge.net/jython/?rev=3310&view=rev Author: cgroves Date: 2007-07-15 02:26:54 -0700 (Sun, 15 Jul 2007) Log Message: ----------- Remove support for Java 1 Modified Paths: -------------- branches/2.3/src/org/python/core/Py.java branches/2.3/src/org/python/core/ThreadStateMapping.java Removed Paths: ------------- branches/2.3/src/org/python/core/ThreadStateMapping2.java Modified: branches/2.3/src/org/python/core/Py.java =================================================================== --- branches/2.3/src/org/python/core/Py.java 2007-07-15 09:26:13 UTC (rev 3309) +++ branches/2.3/src/org/python/core/Py.java 2007-07-15 09:26:54 UTC (rev 3310) @@ -1328,7 +1328,7 @@ if (threadStateMapping == null) { synchronized (Py.class) { if (threadStateMapping == null) - threadStateMapping = ThreadStateMapping.makeMapping(); + threadStateMapping = new ThreadStateMapping(); } } return threadStateMapping.getThreadState(newSystemState); Modified: branches/2.3/src/org/python/core/ThreadStateMapping.java =================================================================== --- branches/2.3/src/org/python/core/ThreadStateMapping.java 2007-07-15 09:26:13 UTC (rev 3309) +++ branches/2.3/src/org/python/core/ThreadStateMapping.java 2007-07-15 09:26:54 UTC (rev 3310) @@ -1,99 +1,24 @@ package org.python.core; -/** - * - * @deprecated Java 1 support is deprecated -- remove. - * - */ class ThreadStateMapping { - //Java 1 support is deprecated -- remove this check. - private static boolean checkedJava2 = false; + private static ThreadLocal cachedThreadState = new ThreadLocal(); - public static ThreadStateMapping makeMapping() { - if (!checkedJava2) { - checkedJava2 = true; - String version = System.getProperty("java.version"); - if (version.compareTo("1.2") >= 0) { - try { - Class c = Class - .forName("org.python.core.ThreadStateMapping2"); - return (ThreadStateMapping) c.newInstance(); - } catch (Throwable t) { - } - } - } - return new ThreadStateMapping(); - } - - // There are hacks that could improve performance slightly in the - // interim, but I'd rather wait for the right solution. - private static java.util.Hashtable threads; - - private static ThreadState cachedThreadState; - - // Mechanism provided by Drew Morrissey and approved by JimH which - // occasionally cleans up dead threads, preventing the hashtable from - // leaking memory when many threads are used (e.g. in an embedded - // application). - // - // counter of additions to the threads table - private static int additionCounter = 0; - - // maximum number of thread additions before cleanup is triggered - private static final int MAX_ADDITIONS = 25; - public ThreadState getThreadState(PySystemState newSystemState) { - Thread t = Thread.currentThread(); - ThreadState ts = cachedThreadState; - if (ts != null && ts.thread == t) { + ThreadState ts = (ThreadState) cachedThreadState.get(); + if (ts != null) { return ts; } - if (threads == null) { - threads = new java.util.Hashtable(); + Thread t = Thread.currentThread(); + + if (newSystemState == null) { + Py.writeDebug("threadstate", "no current system state"); + // t.dumpStack(); + newSystemState = Py.defaultSystemState; } - - ts = (ThreadState) threads.get(t); - if (ts == null) { - if (newSystemState == null) { - Py.writeDebug("threadstate", "no current system state"); - // t.dumpStack(); - newSystemState = Py.defaultSystemState; - } - ts = new ThreadState(t, newSystemState); - // System.err.println("new ts: "+ts+", "+ts.systemState); - threads.put(t, ts); - // increase the counter each time a thread reference is added - // to the table - additionCounter++; - if (additionCounter > MAX_ADDITIONS) { - cleanupThreadTable(); - additionCounter = 0; - } - } - cachedThreadState = ts; - // System.err.println("returning ts: "+ts+", "+ts.systemState); + + ts = new ThreadState(t, newSystemState); + cachedThreadState.set(ts); return ts; } - - /** - * Enumerates through the thread table looking for dead thread references - * and removes them. Called internally by getThreadState(PySystemState). - */ - private void cleanupThreadTable() { - // loop through thread table removing dead thread references - for (java.util.Enumeration e = threads.keys(); e.hasMoreElements();) { - try { - Object key = e.nextElement(); - ThreadState tempThreadState = (ThreadState) threads.get(key); - if ((tempThreadState != null) - && (tempThreadState.thread != null) - && !tempThreadState.thread.isAlive()) { - threads.remove(key); - } - } catch (ClassCastException exc) { - // XXX: we should throw some type of exception here - } - } - } } Deleted: branches/2.3/src/org/python/core/ThreadStateMapping2.java =================================================================== --- branches/2.3/src/org/python/core/ThreadStateMapping2.java 2007-07-15 09:26:13 UTC (rev 3309) +++ branches/2.3/src/org/python/core/ThreadStateMapping2.java 2007-07-15 09:26:54 UTC (rev 3310) @@ -1,24 +0,0 @@ -package org.python.core; - -class ThreadStateMapping2 extends ThreadStateMapping { - private static ThreadLocal cachedThreadState = new ThreadLocal(); - - public ThreadState getThreadState(PySystemState newSystemState) { - ThreadState ts = (ThreadState) cachedThreadState.get(); - if (ts != null) { - return ts; - } - - Thread t = Thread.currentThread(); - - if (newSystemState == null) { - Py.writeDebug("threadstate", "no current system state"); - // t.dumpStack(); - newSystemState = Py.defaultSystemState; - } - - ts = new ThreadState(t, newSystemState); - cachedThreadState.set(ts); - return ts; - } -} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2007-07-15 18:38:48
|
Revision: 3313 http://svn.sourceforge.net/jython/?rev=3313&view=rev Author: cgroves Date: 2007-07-15 11:38:45 -0700 (Sun, 15 Jul 2007) Log Message: ----------- Remove support for JVMs without Java2 collections. Modified Paths: -------------- branches/2.3/src/org/python/core/CollectionIter.java branches/2.3/src/org/python/core/CollectionProxy.java branches/2.3/src/org/python/core/PyInstance.java Removed Paths: ------------- branches/2.3/src/org/python/core/CollectionIter2.java branches/2.3/src/org/python/core/CollectionProxy2.java Modified: branches/2.3/src/org/python/core/CollectionIter.java =================================================================== --- branches/2.3/src/org/python/core/CollectionIter.java 2007-07-15 18:14:10 UTC (rev 3312) +++ branches/2.3/src/org/python/core/CollectionIter.java 2007-07-15 18:38:45 UTC (rev 3313) @@ -2,12 +2,37 @@ package org.python.core; +import java.lang.reflect.Method; +import java.util.Collection; import java.util.Dictionary; import java.util.Enumeration; +import java.util.Iterator; +import java.util.Map; import java.util.Vector; class CollectionIter extends PyObject { PyObject findCollection(Object object) { + if (object instanceof Map) { + return new IteratorIter(((Map) object).keySet().iterator()); + } + if (object instanceof Collection) { + return new IteratorIter(((Collection) object).iterator()); + } + if (object instanceof Iterator) { + return new IteratorIter(((Iterator) object)); + } + try { + // TODO - Once we depend on Java 5 we can replace this with a check + // for the Iterable interface + Method m = object.getClass().getMethod("iterator", new Class[0]); + if (Iterator.class.isAssignableFrom(m.getReturnType())) { + return new IteratorIter((Iterator) m.invoke(object, + new Object[0])); + } + } catch (Exception e) { + // Looks like one of the many reflection based exceptions ocurred so + // we won't get an Iterator this way + } if (object instanceof Vector) { return new EnumerationIter(((Vector) object).elements()); } @@ -44,3 +69,17 @@ return Py.java2py(this.proxy.nextElement()); } } + +class IteratorIter extends CollectionIter { + private Iterator proxy; + + public IteratorIter(Iterator proxy) { + this.proxy = proxy; + } + + public PyObject __iternext__() { + if (!this.proxy.hasNext()) + return null; + return Py.java2py(this.proxy.next()); + } +} Deleted: branches/2.3/src/org/python/core/CollectionIter2.java =================================================================== --- branches/2.3/src/org/python/core/CollectionIter2.java 2007-07-15 18:14:10 UTC (rev 3312) +++ branches/2.3/src/org/python/core/CollectionIter2.java 2007-07-15 18:38:45 UTC (rev 3313) @@ -1,53 +0,0 @@ -// Copyright (c) Finn Bock - -package org.python.core; - -import java.lang.reflect.Method; -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; - -class CollectionIter2 extends CollectionIter { - CollectionIter2() throws Exception { - Class.forName("java.util.Collection"); - } - - PyObject findCollection(Object object) { - if (object instanceof Map) { - return new IteratorIter(((Map) object).keySet().iterator()); - } - if (object instanceof Collection) { - return new IteratorIter(((Collection) object).iterator()); - } - if (object instanceof Iterator) { - return new IteratorIter(((Iterator) object)); - } - try { - // TODO - Once we depend on Java 5 we can replace this with a check - // for the Iterable interface - Method m = object.getClass().getMethod("iterator", new Class[0]); - if (Iterator.class.isAssignableFrom(m.getReturnType())) { - return new IteratorIter((Iterator) m.invoke(object, - new Object[0])); - } - } catch (Exception e) { - // Looks like one of the many reflection based exceptions ocurred so - // we won't get an Iterator this way - } - return null; - } -} - -class IteratorIter extends CollectionIter { - private Iterator proxy; - - public IteratorIter(Iterator proxy) { - this.proxy = proxy; - } - - public PyObject __iternext__() { - if (!this.proxy.hasNext()) - return null; - return Py.java2py(this.proxy.next()); - } -} Modified: branches/2.3/src/org/python/core/CollectionProxy.java =================================================================== --- branches/2.3/src/org/python/core/CollectionProxy.java 2007-07-15 18:14:10 UTC (rev 3312) +++ branches/2.3/src/org/python/core/CollectionProxy.java 2007-07-15 18:38:45 UTC (rev 3313) @@ -2,38 +2,35 @@ package org.python.core; -import java.util.*; +import java.util.Collection; +import java.util.Dictionary; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Vector; class CollectionProxy { public static final CollectionProxy NoProxy = new EnumerationProxy(null); - private static boolean checkedJava2 = false; - - private static CollectionProxy java2Proxy = null; - - public CollectionProxy instanceFindCollection(Object object) { - return null; - } - public static CollectionProxy findCollection(Object object) { if (object == null) return NoProxy; - - if (!checkedJava2) { - checkedJava2 = true; - try { - Class c = Class.forName("org.python.core.CollectionProxy2"); - Class.forName("java.util.Collection"); - java2Proxy = (CollectionProxy) c.newInstance(); - } catch (Throwable t) { - } + + if (object instanceof List) { + return new ListProxy(((List) object)); } - if (java2Proxy != null) { - CollectionProxy ret = java2Proxy.instanceFindCollection(object); - if (ret != null) - return ret; + if (object instanceof Map) { + return new MapProxy(((Map) object)); } + if (object instanceof Collection) { + return new IteratorProxy(((Collection) object).iterator()); + } + if (object instanceof Iterator) { + return new IteratorProxy(((Iterator) object)); + } + if (object instanceof Vector) { return new VectorProxy(((Vector) object)); } @@ -188,3 +185,115 @@ this.proxy.remove(Py.tojava(key, Object.class)); } } +class ListProxy extends CollectionProxy { + List proxy; + + public ListProxy(List proxy) { + this.proxy = proxy; + } + + public int __len__() { + return this.proxy.size(); + } + + public PyObject __finditem__(int key) { + try { + return Py.java2py(this.proxy.get(key)); + } catch (IndexOutOfBoundsException exc) { + return null; + } + } + + public PyObject __finditem__(PyObject key) { + if (key instanceof PyInteger) { + return __finditem__(((PyInteger) key).getValue()); + } else { + throw Py.TypeError("only integer keys accepted"); + } + } + + public void __setitem__(int key, PyObject value) { + this.proxy.set(key, Py.tojava(value, Object.class)); + } + + public void __setitem__(PyObject key, PyObject value) { + if (key instanceof PyInteger) { + __setitem__(((PyInteger) key).getValue(), value); + } else { + throw Py.TypeError("only integer keys accepted"); + } + } + + public void __delitem__(int key) { + this.proxy.remove(key); + } + + public void __delitem__(PyObject key) { + if (key instanceof PyInteger) { + __delitem__(((PyInteger) key).getValue()); + } else { + throw Py.TypeError("only integer keys accepted"); + } + } +} + +class MapProxy extends CollectionProxy { + Map proxy; + + public MapProxy(Map proxy) { + this.proxy = proxy; + } + + public int __len__() { + return this.proxy.size(); + } + + public PyObject __finditem__(int key) { + throw Py.TypeError("loop over non-sequence"); + } + + public PyObject __finditem__(PyObject key) { + return Py.java2py(this.proxy.get(Py.tojava(key, Object.class))); + } + + public void __setitem__(PyObject key, PyObject value) { + this.proxy.put(Py.tojava(key, Object.class), Py.tojava(value, + Object.class)); + } + + public void __delitem__(PyObject key) { + this.proxy.remove(Py.tojava(key, Object.class)); + } +} + +class IteratorProxy extends CollectionProxy { + Iterator proxy; + + int counter; + + public IteratorProxy(Iterator proxy) { + this.proxy = proxy; + this.counter = 0; + } + + public PyObject __finditem__(int key) { + if (key != this.counter) { + throw Py + .ValueError("iterator indices must be consecutive ints starting at 0"); + } + this.counter++; + if (this.proxy.hasNext()) { + return Py.java2py(this.proxy.next()); + } else { + return null; + } + } + + public PyObject __finditem__(PyObject key) { + if (key instanceof PyInteger) { + return __finditem__(((PyInteger) key).getValue()); + } else { + throw Py.TypeError("only integer keys accepted"); + } + } +} Deleted: branches/2.3/src/org/python/core/CollectionProxy2.java =================================================================== --- branches/2.3/src/org/python/core/CollectionProxy2.java 2007-07-15 18:14:10 UTC (rev 3312) +++ branches/2.3/src/org/python/core/CollectionProxy2.java 2007-07-15 18:38:45 UTC (rev 3313) @@ -1,142 +0,0 @@ -// Copyright (c) Corporation for National Research Initiatives - -/* Support for java-1.2 collections - * XXX: Is this used? Or does the new collections integration - * (starting at 2.2a1) make it obsolete? - */ - -package org.python.core; - -import java.util.*; - -class CollectionProxy2 extends CollectionProxy { - public CollectionProxy instanceFindCollection(Object object) { - if (object instanceof List) { - return new ListProxy(((List) object)); - } - if (object instanceof Map) { - return new MapProxy(((Map) object)); - } - if (object instanceof Collection) { - return new IteratorProxy(((Collection) object).iterator()); - } - if (object instanceof Iterator) { - return new IteratorProxy(((Iterator) object)); - } - - return null; - } -} - -class ListProxy extends CollectionProxy { - List proxy; - - public ListProxy(List proxy) { - this.proxy = proxy; - } - - public int __len__() { - return this.proxy.size(); - } - - public PyObject __finditem__(int key) { - try { - return Py.java2py(this.proxy.get(key)); - } catch (IndexOutOfBoundsException exc) { - return null; - } - } - - public PyObject __finditem__(PyObject key) { - if (key instanceof PyInteger) { - return __finditem__(((PyInteger) key).getValue()); - } else { - throw Py.TypeError("only integer keys accepted"); - } - } - - public void __setitem__(int key, PyObject value) { - this.proxy.set(key, Py.tojava(value, Object.class)); - } - - public void __setitem__(PyObject key, PyObject value) { - if (key instanceof PyInteger) { - __setitem__(((PyInteger) key).getValue(), value); - } else { - throw Py.TypeError("only integer keys accepted"); - } - } - - public void __delitem__(int key) { - this.proxy.remove(key); - } - - public void __delitem__(PyObject key) { - if (key instanceof PyInteger) { - __delitem__(((PyInteger) key).getValue()); - } else { - throw Py.TypeError("only integer keys accepted"); - } - } -} - -class MapProxy extends CollectionProxy { - Map proxy; - - public MapProxy(Map proxy) { - this.proxy = proxy; - } - - public int __len__() { - return this.proxy.size(); - } - - public PyObject __finditem__(int key) { - throw Py.TypeError("loop over non-sequence"); - } - - public PyObject __finditem__(PyObject key) { - return Py.java2py(this.proxy.get(Py.tojava(key, Object.class))); - } - - public void __setitem__(PyObject key, PyObject value) { - this.proxy.put(Py.tojava(key, Object.class), Py.tojava(value, - Object.class)); - } - - public void __delitem__(PyObject key) { - this.proxy.remove(Py.tojava(key, Object.class)); - } -} - -class IteratorProxy extends CollectionProxy { - Iterator proxy; - - int counter; - - public IteratorProxy(Iterator proxy) { - this.proxy = proxy; - this.counter = 0; - } - - public PyObject __finditem__(int key) { - if (key != this.counter) { - throw Py - .ValueError("iterator indices must be consecutive ints starting at 0"); - } - this.counter++; - if (this.proxy.hasNext()) { - return Py.java2py(this.proxy.next()); - } else { - return null; - } - } - - public PyObject __finditem__(PyObject key) { - if (key instanceof PyInteger) { - return __finditem__(((PyInteger) key).getValue()); - } else { - throw Py.TypeError("only integer keys accepted"); - } - } -} Modified: branches/2.3/src/org/python/core/PyInstance.java =================================================================== --- branches/2.3/src/org/python/core/PyInstance.java 2007-07-15 18:14:10 UTC (rev 3312) +++ branches/2.3/src/org/python/core/PyInstance.java 2007-07-15 18:38:45 UTC (rev 3313) @@ -674,7 +674,7 @@ throw Py.TypeError("instance has no next() method"); } - private static CollectionIter[] iterFactories = null; + private static CollectionIter[] iterFactories; private PyObject getCollectionIter() { if (iterFactories == null) @@ -690,19 +690,16 @@ private static synchronized void initializeIterators() { if (iterFactories != null) return; - String factories = "org.python.core.CollectionIter," + - "org.python.core.CollectionIter2," + - Py.getSystemState().registry.getProperty( - "python.collections", ""); + String factories = PySystemState.registry.getProperty("python.collections", ""); int i = 0; StringTokenizer st = new StringTokenizer(factories, ","); - iterFactories = new CollectionIter[st.countTokens() + 1]; + iterFactories = new CollectionIter[st.countTokens() + 2]; + iterFactories[0] = new CollectionIter(); while (st.hasMoreTokens()) { String s = st.nextToken(); try { Class factoryClass = Class.forName(s); - CollectionIter factory = - (CollectionIter)factoryClass.newInstance(); + CollectionIter factory = (CollectionIter)factoryClass.newInstance(); iterFactories[i++] = factory; } catch (Throwable t) { } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2007-07-15 18:40:06
|
Revision: 3314 http://svn.sourceforge.net/jython/?rev=3314&view=rev Author: cgroves Date: 2007-07-15 11:40:03 -0700 (Sun, 15 Jul 2007) Log Message: ----------- Remove support for JVMs without the Java 2 {Field|Method|Constructor}.setAccessibility() methods Modified Paths: -------------- branches/2.3/src/org/python/core/Options.java branches/2.3/src/org/python/core/PyJavaClass.java branches/2.3/src/org/python/core/PyReflectedConstructor.java branches/2.3/src/org/python/core/PyReflectedFunction.java Removed Paths: ------------- branches/2.3/src/org/python/core/Java2Accessibility.java branches/2.3/src/org/python/core/JavaAccessibility.java Deleted: branches/2.3/src/org/python/core/Java2Accessibility.java =================================================================== --- branches/2.3/src/org/python/core/Java2Accessibility.java 2007-07-15 18:38:45 UTC (rev 3313) +++ branches/2.3/src/org/python/core/Java2Accessibility.java 2007-07-15 18:40:03 UTC (rev 3314) @@ -1,25 +0,0 @@ -package org.python.core; - -import java.lang.reflect.*; - -/** - * Provides the Java 2 {Field|Method|Constructor}.setAccessibility() methods - * when compiled with, and running under Java 2. - * - * This class should not be compilied (and it won't compile) under Java 1. - */ - -class Java2Accessibility extends JavaAccessibility { - void setAccess(Field field, boolean flag) throws SecurityException { - field.setAccessible(flag); - } - - void setAccess(Method method, boolean flag) throws SecurityException { - method.setAccessible(flag); - } - - void setAccess(Constructor constructor, boolean flag) - throws SecurityException { - constructor.setAccessible(flag); - } -} Deleted: branches/2.3/src/org/python/core/JavaAccessibility.java =================================================================== --- branches/2.3/src/org/python/core/JavaAccessibility.java 2007-07-15 18:38:45 UTC (rev 3313) +++ branches/2.3/src/org/python/core/JavaAccessibility.java 2007-07-15 18:40:03 UTC (rev 3314) @@ -1,66 +0,0 @@ -package org.python.core; -import java.lang.reflect.*; - -/** - * Provides a means of using the Java 2 - * {Field|Method|Constructor}.setAccessibility() methods. - * - * This class was formerly necessary for Java 1 compattibility. - * In the future, this class may be removed. - * @deprecated Java 1 no longer supported. - */ - -class JavaAccessibility -{ - private static JavaAccessibility access = null; - - static void initialize() { - // If registry option - // python.security.respectJavaAccessibility is set, then we set the - // access object to an instance of the subclass Java2Accessibility - if (Options.respectJavaAccessibility) - return; - access = new Java2Accessibility(); - } - - static boolean accessIsMutable() { - return access != null; - } - - /** - * These methods get overridden in the Java2Accessibility subclass - */ - void setAccess(Field field, boolean flag) throws SecurityException { - } - - void setAccess(Method method, boolean flag) throws SecurityException { - } - - void setAccess(Constructor constructor, boolean flag) - throws SecurityException - {} - - public static void setAccessible(Field field, boolean flag) - throws SecurityException - { - if (access != null) { - access.setAccess(field, flag); - } - } - - public static void setAccessible(Method method, boolean flag) - throws SecurityException - { - if (access != null) { - access.setAccess(method, flag); - } - } - - public static void setAccessible(Constructor constructor, boolean flag) - throws SecurityException - { - if (access != null) { - access.setAccess(constructor, flag); - } - } -} Modified: branches/2.3/src/org/python/core/Options.java =================================================================== --- branches/2.3/src/org/python/core/Options.java 2007-07-15 18:38:45 UTC (rev 3313) +++ branches/2.3/src/org/python/core/Options.java 2007-07-15 18:40:03 UTC (rev 3314) @@ -172,8 +172,5 @@ + "setting: '" + prop + "'"); } } - // additional initializations which must happen after the registry - // is guaranteed to be initialized. - JavaAccessibility.initialize(); } } Modified: branches/2.3/src/org/python/core/PyJavaClass.java =================================================================== --- branches/2.3/src/org/python/core/PyJavaClass.java 2007-07-15 18:38:45 UTC (rev 3313) +++ branches/2.3/src/org/python/core/PyJavaClass.java 2007-07-15 18:40:03 UTC (rev 3314) @@ -258,7 +258,7 @@ * false, in which case all fields are returned. */ private static Field[] getAccessibleFields(Class c) { - if (!JavaAccessibility.accessIsMutable()) + if (Options.respectJavaAccessibility) // returns just the public fields return c.getFields(); java.util.ArrayList fields = new java.util.ArrayList(); @@ -269,7 +269,7 @@ for (int i=0; i < declared.length; i++) { // TBD: this is a permanent change. Should we provide a // way to restore the original accessibility flag? - JavaAccessibility.setAccessible(declared[i], true); + declared[i].setAccessible(true); fields.add(declared[i]); } // walk down superclass chain. no need to deal specially with @@ -386,14 +386,14 @@ * false, in which case all methods are returned. */ private static Method[] getAccessibleMethods(Class c) { - if (!JavaAccessibility.accessIsMutable()) + if (Options.respectJavaAccessibility) // returns just the public methods return c.getMethods(); Method[] declared = c.getDeclaredMethods(); for (int i=0; i < declared.length; i++) { // TBD: this is a permanent change. Should we provide a way to // restore the original accessibility flag? - JavaAccessibility.setAccessible(declared[i], true); + declared[i].setAccessible(true); } return declared; } @@ -670,7 +670,7 @@ * inherited like methods or fields. */ private static Constructor[] getAccessibleConstructors(Class c) { - if (!JavaAccessibility.accessIsMutable()) + if (Options.respectJavaAccessibility) // returns just the public fields return c.getConstructors(); // return all constructors @@ -680,7 +680,7 @@ for (int i=0; i < declared.length; i++) { // TBD: this is a permanent change. Should we provide a way to // restore the original accessibility flag? - JavaAccessibility.setAccessible(declared[i], true); + declared[i].setAccessible(true); } return declared; } Modified: branches/2.3/src/org/python/core/PyReflectedConstructor.java =================================================================== --- branches/2.3/src/org/python/core/PyReflectedConstructor.java 2007-07-15 18:38:45 UTC (rev 3313) +++ branches/2.3/src/org/python/core/PyReflectedConstructor.java 2007-07-15 18:40:03 UTC (rev 3314) @@ -30,7 +30,7 @@ public void addConstructor(Constructor m) { int mods = m.getModifiers(); // Only add public methods unless we're overriding - if (!Modifier.isPublic(mods) && !JavaAccessibility.accessIsMutable()) + if (!Modifier.isPublic(mods) && Options.respectJavaAccessibility) return; addArgs(makeArgs(m)); } Modified: branches/2.3/src/org/python/core/PyReflectedFunction.java =================================================================== --- branches/2.3/src/org/python/core/PyReflectedFunction.java 2007-07-15 18:38:45 UTC (rev 3313) +++ branches/2.3/src/org/python/core/PyReflectedFunction.java 2007-07-15 18:40:03 UTC (rev 3314) @@ -74,7 +74,7 @@ public void addMethod(Method m) { int mods = m.getModifiers(); // Only add public methods unless we're overriding - if (!Modifier.isPublic(mods) && !JavaAccessibility.accessIsMutable()) + if (!Modifier.isPublic(mods) && Options.respectJavaAccessibility) return; addArgs(makeArgs(m)); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2007-07-30 02:33:38
|
Revision: 3364 http://jython.svn.sourceforge.net/jython/?rev=3364&view=rev Author: cgroves Date: 2007-07-29 19:33:35 -0700 (Sun, 29 Jul 2007) Log Message: ----------- Use __repr__ or __str__ methods added to the dict of a Java class in preference to its toString. Fixes bug #1748817. Modified Paths: -------------- branches/2.3/src/org/python/core/PyInstance.java branches/2.3/src/org/python/core/PyJavaInstance.java Modified: branches/2.3/src/org/python/core/PyInstance.java =================================================================== --- branches/2.3/src/org/python/core/PyInstance.java 2007-07-28 19:37:09 UTC (rev 3363) +++ branches/2.3/src/org/python/core/PyInstance.java 2007-07-30 02:33:35 UTC (rev 3364) @@ -385,24 +385,33 @@ public PyString __repr__() { PyObject ret = invoke_ex("__repr__"); if (ret == null) { - PyObject mod = instclass.__dict__.__finditem__("__module__"); - String smod; - if (mod == Py.None) smod = ""; - else { - if (mod == null || !(mod instanceof PyString)) - smod = "<unknown>."; - else - smod = ((PyString)mod).toString()+'.'; - } - return new PyString("<"+smod+instclass.__name__+ - " instance "+Py.idstr(this)+">"); + return makeDefaultRepr(); } - if (!(ret instanceof PyString)) throw Py.TypeError("__repr__ method must return a string"); return (PyString)ret; } + /** + * If a class doesn't define a __repr__ method of its own, the return + * value from this method is used. + */ + protected PyString makeDefaultRepr() { + PyObject mod = instclass.__dict__.__finditem__("__module__"); + String smod; + if(mod == Py.None) { + smod = ""; + } else { + if(mod == null || !(mod instanceof PyString)) { + smod = "<unknown>."; + } else { + smod = ((PyString)mod).toString() + '.'; + } + } + return new PyString("<" + smod + instclass.__name__ + " instance " + + Py.idstr(this) + ">"); + } + public PyString __str__() { PyObject ret = invoke_ex("__str__"); if (ret == null) Modified: branches/2.3/src/org/python/core/PyJavaInstance.java =================================================================== --- branches/2.3/src/org/python/core/PyJavaInstance.java 2007-07-28 19:37:09 UTC (rev 3363) +++ branches/2.3/src/org/python/core/PyJavaInstance.java 2007-07-30 02:33:35 UTC (rev 3364) @@ -6,8 +6,7 @@ * A wrapper around a java instance. */ -public class PyJavaInstance - extends PyInstance +public class PyJavaInstance extends PyInstance implements java.io.Externalizable { public PyJavaInstance() { @@ -79,8 +78,8 @@ } protected void unassignableField(String name, PyObject value) { - throw Py.TypeError("can't assign to this attribute in java " + - "instance: " + name); + throw Py.TypeError("can't assign to this attribute in java instance: " + + name); } public int hashCode() { @@ -112,14 +111,10 @@ return -2; } - public PyString __str__() { + protected PyString makeDefaultRepr() { return new PyString(javaProxy.toString()); } - public PyString __repr__() { - return __str__(); - } - public void __delattr__(String attr) { throw Py.TypeError("can't delete attr from java instance: "+attr); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cg...@us...> - 2007-08-07 04:52:37
|
Revision: 3401 http://jython.svn.sourceforge.net/jython/?rev=3401&view=rev Author: cgroves Date: 2007-08-06 21:52:29 -0700 (Mon, 06 Aug 2007) Log Message: ----------- Add support for PyLongs to range instead of just Java longs. Raise a more accurate exception for a bad value passed to oct Modified Paths: -------------- branches/2.3/src/org/python/core/PyObject.java branches/2.3/src/org/python/core/__builtin__.java Modified: branches/2.3/src/org/python/core/PyObject.java =================================================================== --- branches/2.3/src/org/python/core/PyObject.java 2007-08-06 00:23:22 UTC (rev 3400) +++ branches/2.3/src/org/python/core/PyObject.java 2007-08-07 04:52:29 UTC (rev 3401) @@ -1240,7 +1240,7 @@ * Equivalent to the standard Python __cmp__ method. * * @param other the object to compare this with. - * @return -1 if this < 0; 0 if this == o; +1 if this > o; -2 if no + * @return -1 if this < o; 0 if this == o; +1 if this > o; -2 if no * comparison is implemented **/ public int __cmp__(PyObject other) { Modified: branches/2.3/src/org/python/core/__builtin__.java =================================================================== --- branches/2.3/src/org/python/core/__builtin__.java 2007-08-06 00:23:22 UTC (rev 3400) +++ branches/2.3/src/org/python/core/__builtin__.java 2007-08-07 04:52:29 UTC (rev 3401) @@ -44,7 +44,7 @@ case 1: return Py.newInteger(__builtin__.len(arg1)); case 2: - return __builtin__.range(Py.py2long(arg1)); + return __builtin__.range(arg1); case 3: if (!(arg1 instanceof PyString)) throw Py.TypeError("ord() expected string of length 1, but " + arg1.getType().getFullName() + " found"); @@ -123,7 +123,7 @@ public PyObject __call__(PyObject arg1, PyObject arg2) { switch (this.index) { case 2: - return __builtin__.range(Py.py2long(arg1), Py.py2long(arg2)); + return __builtin__.range(arg1, arg2); case 6: return Py.newInteger(__builtin__.cmp(arg1, arg2)); case 9: @@ -184,7 +184,7 @@ public PyObject __call__(PyObject arg1, PyObject arg2, PyObject arg3) { switch (this.index) { case 2: - return __builtin__.range(Py.py2long(arg1), Py.py2long(arg2), Py.py2long(arg3)); + return __builtin__.range(arg1, arg2, arg3); case 9: try { if (arg3 instanceof PyStringMap) { @@ -797,9 +797,16 @@ return min; } - public static PyString oct(PyObject o) { - return o.__oct__(); - } + public static PyString oct(PyObject o) { + try { + return o.__oct__(); + } catch(PyException e) { + if(Py.matchException(e, Py.AttributeError)) { + throw Py.TypeError("oct() argument can't be converted to oct"); + } + throw e; + } + } public static final int ord(char c) { return c; @@ -877,39 +884,58 @@ throw Py.TypeError("__pow__ not defined for these operands"); } - public static PyObject range(long start, long stop, long step) { - if(step == 0) { + public static PyObject range(PyObject start, PyObject stop, PyObject step) { + // Check that step is valid. + int stepCmp = step.__cmp__(Py.Zero); + if(stepCmp == -2) { + throw Py.TypeError("non-integer type for step in range()"); + } else if(stepCmp == 0) { throw Py.ValueError("zero step for range()"); } - long n; - if(step > 0) { - n = (stop - start + step - 1) / step; - } else { - n = (stop - start + step + 1) / step; + // Calculate the number of values in the range. + PyObject n = stop.__sub__(start); + if(n == null) { + throw Py.TypeError("non-integer type for start or stop in range()"); } - if(n <= 0) { + n = n.__add__(step); + if(stepCmp == 1) { // step is positive + n = n.__sub__(Py.One).__div__(step); + } else { // step is negative + n = n.__add__(Py.One).__div__(step); + } + + // Check that the number of values is valid. + if(n.__cmp__(Py.Zero) <= 0) { return new PyList(); } - if(n > Integer.MAX_VALUE) { - throw Py.TypeError("Can't use range for more than " + Integer.MAX_VALUE - + " items. Try xrange instead."); + Object nAsInteger = n.__tojava__(Integer.TYPE); + if(nAsInteger == Py.NoConversion) { + if(n instanceof PyLong) { + throw Py.OverflowError("Can't use range for more than " + Integer.MAX_VALUE + + " items. Try xrange instead."); + } else { + throw Py.TypeError("non-integer type for start or stop in range()"); + } } - PyObject[] objs = new PyObject[(int)n]; - long j = start; - for(int i = 0; i < n; i++, j += step) { - objs[i] = Py.newInteger(j); + // Fill in the range. + int nAsInt = ((Integer)nAsInteger).intValue(); + PyObject j = start; + PyObject[] objs = new PyObject[nAsInt]; + for(int i = 0; i < nAsInt; i++) { + objs[i] = j; + j = j.__add__(step); } return new PyList(objs); } - public static PyObject range(long n) { - return range(0, n, 1); + public static PyObject range(PyObject n) { + return range(Py.Zero, n, Py.One); } - public static PyObject range(long start, long stop) { - return range(start, stop, 1); + public static PyObject range(PyObject start, PyObject stop) { + return range(start, stop, Py.One); } private static PyString readline(PyObject file) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |