Issue1768990
Created on 2007-08-07.05:43:05 by cgroves, last changed 2007-09-22.06:35:29 by pjenvey.
Messages | |||
---|---|---|---|
msg1828 (view) | Author: Charlie Groves (cgroves) | Date: 2007-08-07.05:43:05 | |
pickle blows up with a StackOverflow when picking a subclass of a builtin like int or str. This is tested by test_subclass, but that test is commented out for now as explained in http://wiki.python.org/jython/JythonDeveloperGuide/VersionTransitionTestExclusions |
|||
msg1829 (view) | Author: Mehendran (mehendran) | Date: 2007-08-13.13:47:14 | |
Code snippet: ------------- class mystr(str): def __init__(self, x): self.str = str(x) a = mystr('x') b = str(a) # This doesn't work In this code, I am not able to pass the 'a' value to 'str' type. It throws stack overflow error. The bug is not in the pickle module, but is only in this line. I am trying to figure out. |
|||
msg1830 (view) | Author: Mehendran (mehendran) | Date: 2007-08-14.14:18:37 | |
Patch is added with the patch number: [1773865] Problem: ======== PyString.java ------------- final static PyObject str_new(PyNewWrapper new_, boolean init, PyType subtype, PyObject[] args, String[] keywords) { ArgParser ap = new ArgParser("str", args, keywords, new String[] { "object" }, 0); PyObject S = ap.getPyObject(0, null); if(new_.for_type == subtype) { if(S == null) { return new PyString(""); } return S.__str__(); --- --- --- } Here S is an arg of type PyStringDerived. When you call S.__str__(), it is returning a string of type PyStringDerived with the contents of arg. But this leads to making calls to __init__ of mystr class as in the following. PyType.java ------------ private static PyObject invoke_new_(PyObject new_,PyType type .....{ ... newobj.dispatch__init__(type,args,keywords); return newobj; } Here newobj is nothing but an obj of type PyStringDerived. This causes the invocation of the following code. PyStringDerived.java --------------------- 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__"); <<< call to __init__ of mystr >>> }} So here, the constructor is called recursively and it causes stackoverflow. Solution: ========= PyString.java ------------- final static PyObject str_new(PyNewWrapper new_, boolean init, PyType subtype, PyObject[] args, String[] keywords) { --- return new PyString(S.__str__().toString()); //CHANGE --- } |
|||
msg1831 (view) | Author: Philip Jenvey (pjenvey) | Date: 2007-09-22.06:35:29 | |
fixed in r3498/3499. thanks mehendran! |
History | |||
---|---|---|---|
Date | User | Action | Args |
2007-08-07 05:43:05 | cgroves | create |
Supported by Python Software Foundation,
Powered by Roundup