Index: src/org/python/core/PyTableCode.java =================================================================== --- src/org/python/core/PyTableCode.java (revision 7109) +++ src/org/python/core/PyTableCode.java (working copy) @@ -99,23 +99,22 @@ } public PyObject __findattr_ex__(String name) { - // have to craft co_varnames specially - if (name == "co_varnames") { + if (name.equals("co_varnames")) { return toPyStringTuple(co_varnames); } - if (name == "co_cellvars") { + if (name.equals("co_cellvars")) { return toPyStringTuple(co_cellvars); } - if (name == "co_freevars") { + if (name.equals("co_freevars")) { return toPyStringTuple(co_freevars); } - if (name == "co_filename") { + if (name.equals("co_filename")) { return new PyString(co_filename); } - if (name == "co_name") { + if (name.equals("co_name")) { return new PyString(co_name); } - if (name == "co_flags") { + if (name.equals("co_flags")) { return Py.newInteger(co_flags.toBits()); } return super.__findattr_ex__(name); Index: src/org/python/core/PyString.java =================================================================== --- src/org/python/core/PyString.java (revision 7109) +++ src/org/python/core/PyString.java (working copy) @@ -2,6 +2,8 @@ package org.python.core; import java.math.BigInteger; +import java.util.Map; +import java.util.Set; import org.python.core.util.ExtraMath; import org.python.core.util.StringUtil; @@ -9,6 +11,8 @@ import org.python.expose.ExposedNew; import org.python.expose.ExposedType; import org.python.expose.MethodType; +import org.python.util.Generic; +import com.google.common.collect.MapMaker; /** * A builtin python string. @@ -17,8 +21,12 @@ public class PyString extends PyBaseString { public static final PyType TYPE = PyType.fromClass(PyString.class); - protected String string; // cannot make final because of Python intern support - protected transient boolean interned=false; + private static final Set internedStrings; + static { + Map tempMap = new MapMaker().weakKeys().makeMap(); + internedStrings = Generic.newSetFromMap(tempMap); + } + protected final String string; public String getString() { return string; @@ -56,7 +64,7 @@ */ public static PyString fromInterned(String interned) { PyString str = new PyString(TYPE, interned); - str.interned = true; + str.intern(); return str; } @@ -78,6 +86,10 @@ } } + protected void intern() { + internedStrings.add(getString()); + } + public int[] toCodePoints() { int n = getString().length(); int[] codePoints = new int[n]; @@ -125,13 +137,8 @@ } public String internedString() { - if (interned) - return getString(); - else { - string = getString().intern(); - interned = true; - return getString(); - } + intern(); + return getString(); } @Override Index: src/org/python/core/PyUnicode.java =================================================================== --- src/org/python/core/PyUnicode.java (revision 7109) +++ src/org/python/core/PyUnicode.java (working copy) @@ -114,7 +114,7 @@ */ public static PyUnicode fromInterned(String interned) { PyUnicode uni = new PyUnicode(TYPE, interned); - uni.interned = true; + uni.intern(); return uni; }