Skip to content

Commit a1322e5

Browse files
committed
Move PString utf8 and wchar representations to hidden fields
1 parent e0113d5 commit a1322e5

File tree

4 files changed

+45
-40
lines changed

4 files changed

+45
-40
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextUnicodeBuiltins.java

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@
144144
import com.oracle.graal.python.lib.PyUnicodeFromEncodedObject;
145145
import com.oracle.graal.python.lib.RichCmpOp;
146146
import com.oracle.graal.python.nodes.ErrorMessages;
147+
import com.oracle.graal.python.nodes.HiddenAttr;
147148
import com.oracle.graal.python.nodes.PGuards;
148149
import com.oracle.graal.python.nodes.PRaiseNode;
149150
import com.oracle.graal.python.nodes.StringLiterals;
@@ -1165,15 +1166,18 @@ static Object doUnicode(PString s, Object sizePtr,
11651166
@Cached InlinedConditionProfile hasSizeProfile,
11661167
@Cached InlinedConditionProfile hasUtf8Profile,
11671168
@Cached CStructAccess.WriteLongNode writeLongNode,
1168-
@Cached _PyUnicode_AsUTF8String asUTF8String) {
1169-
if (hasUtf8Profile.profile(inliningTarget, s.getUtf8Bytes() == null)) {
1170-
PBytes bytes = (PBytes) asUTF8String.execute(s, T_STRICT);
1171-
s.setUtf8Bytes(bytes);
1169+
@Cached _PyUnicode_AsUTF8String asUTF8String,
1170+
@Cached HiddenAttr.ReadNode readAttrNode,
1171+
@Cached HiddenAttr.WriteNode writeAttrNode) {
1172+
PBytes utf8bytes = s.getUtf8Bytes(inliningTarget, readAttrNode);
1173+
if (hasUtf8Profile.profile(inliningTarget, utf8bytes == null)) {
1174+
utf8bytes = (PBytes) asUTF8String.execute(s, T_STRICT);
1175+
s.setUtf8Bytes(inliningTarget, writeAttrNode, utf8bytes);
11721176
}
11731177
if (hasSizeProfile.profile(inliningTarget, !lib.isNull(sizePtr))) {
1174-
writeLongNode.write(sizePtr, s.getUtf8Bytes().getSequenceStorage().length());
1178+
writeLongNode.write(sizePtr, utf8bytes.getSequenceStorage().length());
11751179
}
1176-
return PySequenceArrayWrapper.ensureNativeSequence(s.getUtf8Bytes());
1180+
return PySequenceArrayWrapper.ensureNativeSequence(utf8bytes);
11771181
}
11781182

11791183
@Fallback
@@ -1214,16 +1218,19 @@ static Object doUnicode(PString s, Object sizePtr,
12141218
@Cached InlinedConditionProfile hasSizeProfile,
12151219
@Cached InlinedConditionProfile hasUnicodeProfile,
12161220
@Cached CStructAccess.WriteLongNode writeLongNode,
1217-
@Cached UnicodeAsWideCharNode asWideCharNode) {
1221+
@Cached UnicodeAsWideCharNode asWideCharNode,
1222+
@Cached HiddenAttr.ReadNode readAttrNode,
1223+
@Cached HiddenAttr.WriteNode writeAttrNode) {
12181224
int wcharSize = CStructs.wchar_t.size();
1219-
if (hasUnicodeProfile.profile(inliningTarget, s.getWCharBytes() == null)) {
1220-
PBytes bytes = asWideCharNode.executeNativeOrder(inliningTarget, s, wcharSize);
1221-
s.setWCharBytes(bytes);
1225+
PBytes wcharBytes = s.getWCharBytes(inliningTarget, readAttrNode);
1226+
if (hasUnicodeProfile.profile(inliningTarget, wcharBytes == null)) {
1227+
wcharBytes = asWideCharNode.executeNativeOrder(inliningTarget, s, wcharSize);
1228+
s.setWCharBytes(inliningTarget, writeAttrNode, wcharBytes);
12221229
}
12231230
if (hasSizeProfile.profile(inliningTarget, !lib.isNull(sizePtr))) {
1224-
writeLongNode.write(sizePtr, s.getWCharBytes().getSequenceStorage().length() / wcharSize);
1231+
writeLongNode.write(sizePtr, wcharBytes.getSequenceStorage().length() / wcharSize);
12251232
}
1226-
return PySequenceArrayWrapper.ensureNativeSequence(s.getWCharBytes());
1233+
return PySequenceArrayWrapper.ensureNativeSequence(wcharBytes);
12271234
}
12281235

12291236
@Fallback

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/PString.java

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
3232
import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
3333
import com.oracle.graal.python.builtins.objects.str.StringNodes.StringMaterializeNode;
34+
import com.oracle.graal.python.nodes.HiddenAttr;
3435
import com.oracle.graal.python.nodes.util.CannotCastException;
3536
import com.oracle.graal.python.nodes.util.CastToTruffleStringNode;
3637
import com.oracle.graal.python.runtime.GilNode;
@@ -54,13 +55,6 @@ public final class PString extends PythonBuiltinObject {
5455
private TruffleString materializedValue;
5556
private NativeCharSequence nativeCharSequence;
5657

57-
/*
58-
* We need to keep a reference to the encoded forms for functions that return char pointers to
59-
* keep the underlying memory alive (NativeSequenceStorage frees memory in finalizer).
60-
*/
61-
private PBytes utf8Bytes;
62-
private PBytes wCharBytes;
63-
6458
public PString(Object clazz, Shape instanceShape, NativeCharSequence value) {
6559
super(builtinClassToType(clazz), instanceShape);
6660
this.nativeCharSequence = value;
@@ -77,6 +71,22 @@ public TruffleString getValueUncached() {
7771
return isMaterialized() ? getMaterialized() : StringMaterializeNode.executeUncached(this);
7872
}
7973

74+
public PBytes getUtf8Bytes(Node inliningTarget, HiddenAttr.ReadNode readNode) {
75+
return (PBytes) readNode.execute(inliningTarget, this, HiddenAttr.PSTRING_UTF8, null);
76+
}
77+
78+
public void setUtf8Bytes(Node inliningTarget, HiddenAttr.WriteNode writeNode, PBytes value) {
79+
writeNode.execute(inliningTarget, this, HiddenAttr.PSTRING_UTF8, value);
80+
}
81+
82+
public PBytes getWCharBytes(Node inliningTarget, HiddenAttr.ReadNode readNode) {
83+
return (PBytes) readNode.execute(inliningTarget, this, HiddenAttr.PSTRING_WCHAR, null);
84+
}
85+
86+
public void setWCharBytes(Node inliningTarget, HiddenAttr.WriteNode writeNode, PBytes value) {
87+
writeNode.execute(inliningTarget, this, HiddenAttr.PSTRING_WCHAR, value);
88+
}
89+
8090
public boolean isNativeCharSequence() {
8191
return nativeCharSequence != null;
8292
}
@@ -114,22 +124,6 @@ public String toString() {
114124
return isMaterialized() ? materializedValue.toJavaStringUncached() : nativeCharSequence.toString();
115125
}
116126

117-
public PBytes getUtf8Bytes() {
118-
return utf8Bytes;
119-
}
120-
121-
public void setUtf8Bytes(PBytes bytes) {
122-
this.utf8Bytes = bytes;
123-
}
124-
125-
public PBytes getWCharBytes() {
126-
return wCharBytes;
127-
}
128-
129-
public void setWCharBytes(PBytes bytes) {
130-
this.wCharBytes = bytes;
131-
}
132-
133127
@Override
134128
public int hashCode() {
135129
return isMaterialized() ? materializedValue.hashCode() : nativeCharSequence.hashCode();

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/type/TypeBuiltins.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,10 @@
7777
import java.util.List;
7878

7979
import com.oracle.graal.python.PythonLanguage;
80+
import com.oracle.graal.python.annotations.Builtin;
8081
import com.oracle.graal.python.annotations.Slot;
8182
import com.oracle.graal.python.annotations.Slot.SlotKind;
8283
import com.oracle.graal.python.annotations.Slot.SlotSignature;
83-
import com.oracle.graal.python.annotations.Builtin;
8484
import com.oracle.graal.python.builtins.CoreFunctions;
8585
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
8686
import com.oracle.graal.python.builtins.PythonBuiltins;
@@ -134,6 +134,7 @@
134134
import com.oracle.graal.python.lib.PyObjectLookupAttr;
135135
import com.oracle.graal.python.lib.PyObjectReprAsTruffleStringNode;
136136
import com.oracle.graal.python.nodes.ErrorMessages;
137+
import com.oracle.graal.python.nodes.HiddenAttr;
137138
import com.oracle.graal.python.nodes.PConstructAndRaiseNode;
138139
import com.oracle.graal.python.nodes.PGuards;
139140
import com.oracle.graal.python.nodes.PNodeWithContext;
@@ -877,18 +878,19 @@ static void set(PythonClass type, TruffleString value) {
877878
}
878879

879880
@Specialization
880-
static void set(PythonAbstractNativeObject type, TruffleString value,
881+
static void set(Node inliningTarget, PythonAbstractNativeObject type, TruffleString value,
881882
@Bind PythonLanguage language,
882883
@Cached(inline = false) CStructAccess.WritePointerNode writePointerNode,
883884
@Cached(inline = false) CStructAccess.WriteObjectNewRefNode writeObject,
885+
@Cached HiddenAttr.WriteNode writeAttrNode,
884886
@Cached TruffleString.SwitchEncodingNode switchEncodingNode,
885887
@Cached TruffleString.CopyToByteArrayNode copyToByteArrayNode) {
886888
value = switchEncodingNode.execute(value, TruffleString.Encoding.UTF_8);
887889
byte[] bytes = copyToByteArrayNode.execute(value, TruffleString.Encoding.UTF_8);
888-
PBytes bytesObject = PFactory.createBytes(language, bytes);
889-
writePointerNode.writeToObj(type, PyTypeObject__tp_name, PySequenceArrayWrapper.ensureNativeSequence(bytesObject));
890+
PBytes utf8Bytes = PFactory.createBytes(language, bytes);
891+
writePointerNode.writeToObj(type, PyTypeObject__tp_name, PySequenceArrayWrapper.ensureNativeSequence(utf8Bytes));
890892
PString pString = PFactory.createString(language, value);
891-
pString.setUtf8Bytes(bytesObject);
893+
writeAttrNode.execute(inliningTarget, pString, HiddenAttr.PSTRING_UTF8, utf8Bytes);
892894
writeObject.writeToObject(type, PyHeapTypeObject__ht_name, pString);
893895
}
894896
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/HiddenAttr.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ public final class HiddenAttr {
102102
public static final HiddenAttr NATIVE_SLOTS = new HiddenAttr("__native_slots__");
103103
public static final HiddenAttr INSTANCESHAPE = new HiddenAttr("instanceshape");
104104
public static final HiddenAttr STRUCTSEQ_FIELD_NAMES = new HiddenAttr("struct_seq_field_names");
105+
public static final HiddenAttr PSTRING_UTF8 = new HiddenAttr("utf8");
106+
public static final HiddenAttr PSTRING_WCHAR = new HiddenAttr("wchar");
105107

106108
private final HiddenKey key;
107109

0 commit comments

Comments
 (0)