Skip to content

Commit 8455461

Browse files
committed
Consider element size when materializing NativeCharSequence
1 parent 549760e commit 8455461

File tree

3 files changed

+34
-6
lines changed

3 files changed

+34
-6
lines changed

graalpython/com.oracle.graal.python.cext/src/capi.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -480,13 +480,16 @@ const char* PyTruffle_StringToCstr(void* o, int32_t strLen) {
480480
return str;
481481
}
482482

483+
/* Use this function to decode a C char array to a Java string using the source file encoding. */
483484
void* PyTruffle_CstrToString(void* o) {
484-
if (polyglot_fits_in_i64(o)) {
485-
return polyglot_from_string((const char*)polyglot_as_i64(o), SRC_CS);
486-
}
487485
return polyglot_from_string(o, SRC_CS);
488486
}
489487

488+
/* Use this function to decode a C ASCII string to a Java string. */
489+
void* PyTruffle_AsciiToString(void* ptr) {
490+
return polyglot_from_string(ptr, "ascii");
491+
}
492+
490493
/* To be used from Java code only.
491494
* This function is used if a native class inherits from a managed class but uses the 'object.__new__'.
492495
* This function roughly corresponds to CPython's 'object_new'. */

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/NativeCAPISymbols.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public abstract class NativeCAPISymbols {
5555
public static final String FUN_PY_NONE_HANDLE = "PyNoneHandle";
5656
public static final String FUN_WHCAR_SIZE = "PyTruffle_Wchar_Size";
5757
public static final String FUN_PY_TRUFFLE_CSTR_TO_STRING = "PyTruffle_CstrToString";
58+
public static final String FUN_PY_TRUFFLE_ASCII_TO_STRING = "PyTruffle_AsciiToString";
5859
public static final String FUN_PY_FLOAT_AS_DOUBLE = "truffle_read_ob_fval";
5960
public static final String FUN_GET_OB_TYPE = "get_ob_type";
6061
public static final String FUN_GET_OB_REFCNT = "get_ob_refcnt";

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

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.ToSulongNode;
5151
import com.oracle.graal.python.builtins.objects.cext.NativeCAPISymbols;
5252
import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject;
53+
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.UnicodeFromWcharNode;
5354
import com.oracle.graal.python.builtins.objects.common.SequenceNodes;
5455
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
5556
import com.oracle.graal.python.builtins.objects.ints.PInt;
@@ -111,10 +112,10 @@ static String doMaterializedNative(PString x) {
111112

112113
@Specialization(guards = {"isNativeCharSequence(x)"}, replaces = "doMaterializedNative")
113114
static String doNative(PString x,
114-
@Cached PCallCapiFunction callCStringToStringNode) {
115+
@Cached PCallCapiFunction callCStringToStringNode,
116+
@Cached UnicodeFromWcharNode fromWcharNode) {
115117
// cast guaranteed by the guard
116-
NativeCharSequence nativeCharSequence = (NativeCharSequence) x.getCharSequence();
117-
String materialized = (String) callCStringToStringNode.call(NativeCAPISymbols.FUN_PY_TRUFFLE_CSTR_TO_STRING, nativeCharSequence.getPtr());
118+
String materialized = materializeNativeCharSequence((NativeCharSequence) x.getCharSequence(), callCStringToStringNode, fromWcharNode);
118119
x.setCharSequence(materialized);
119120
return materialized;
120121
}
@@ -132,6 +133,29 @@ static String doMaterialized(PString x) {
132133
// cast guaranteed by the guard
133134
return (String) x.getCharSequence();
134135
}
136+
137+
public static String materializeNativeCharSequence(NativeCharSequence nativeCharSequence,
138+
PCallCapiFunction callCStringToStringNode,
139+
UnicodeFromWcharNode fromWcharNode) {
140+
// cast guaranteed by the guard
141+
String materialized;
142+
if (nativeCharSequence.isAsciiOnly()) {
143+
materialized = (String) callCStringToStringNode.call(NativeCAPISymbols.FUN_PY_TRUFFLE_ASCII_TO_STRING, nativeCharSequence.getPtr());
144+
} else {
145+
switch (nativeCharSequence.getElementSize()) {
146+
case 1:
147+
materialized = (String) callCStringToStringNode.call(NativeCAPISymbols.FUN_PY_TRUFFLE_CSTR_TO_STRING, nativeCharSequence.getPtr());
148+
break;
149+
case 2:
150+
case 4:
151+
materialized = fromWcharNode.execute(nativeCharSequence.getPtr(), nativeCharSequence.getElementSize());
152+
break;
153+
default:
154+
throw CompilerDirectives.shouldNotReachHere("illegal element size");
155+
}
156+
}
157+
return materialized;
158+
}
135159
}
136160

137161
@GenerateUncached

0 commit comments

Comments
 (0)