Skip to content

Commit 143ecef

Browse files
committed
Add cases for CArrayWrappers in FromCharPointerNode
1 parent 8b67e97 commit 143ecef

File tree

1 file changed

+24
-5
lines changed
  • graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi

1 file changed

+24
-5
lines changed

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

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@
6060
import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
6161
import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject;
6262
import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr;
63+
import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext.LLVMType;
64+
import com.oracle.graal.python.builtins.objects.cext.capi.CArrayWrappers.CArrayWrapper;
65+
import com.oracle.graal.python.builtins.objects.cext.capi.CArrayWrappers.CByteArrayWrapper;
66+
import com.oracle.graal.python.builtins.objects.cext.capi.CArrayWrappers.CStringWrapper;
6367
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.AllToJavaNodeGen;
6468
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.AllToSulongNodeGen;
6569
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.AsPythonObjectNodeGen;
@@ -77,7 +81,6 @@
7781
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodesFactory.WrapVoidPtrNodeGen;
7882
import com.oracle.graal.python.builtins.objects.cext.capi.DynamicObjectNativeWrapper.PrimitiveNativeWrapper;
7983
import com.oracle.graal.python.builtins.objects.cext.capi.DynamicObjectNativeWrapper.PythonObjectNativeWrapper;
80-
import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext.LLVMType;
8184
import com.oracle.graal.python.builtins.objects.cext.capi.NativeReferenceCache.ResolveNativeReferenceNode;
8285
import com.oracle.graal.python.builtins.objects.cext.capi.PyTruffleObjectFree.FreeNode;
8386
import com.oracle.graal.python.builtins.objects.cext.common.CExtAsPythonObjectNode;
@@ -132,11 +135,11 @@
132135
import com.oracle.truffle.api.Assumption;
133136
import com.oracle.truffle.api.CompilerAsserts;
134137
import com.oracle.truffle.api.CompilerDirectives;
138+
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
135139
import com.oracle.truffle.api.RootCallTarget;
136140
import com.oracle.truffle.api.Truffle;
137141
import com.oracle.truffle.api.TruffleLanguage.ContextReference;
138142
import com.oracle.truffle.api.TruffleLogger;
139-
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
140143
import com.oracle.truffle.api.dsl.Cached;
141144
import com.oracle.truffle.api.dsl.Cached.Exclusive;
142145
import com.oracle.truffle.api.dsl.Cached.Shared;
@@ -1445,13 +1448,29 @@ public static AsCharPointerNode getUncached() {
14451448
public abstract static class FromCharPointerNode extends Node {
14461449
public abstract Object execute(Object charPtr);
14471450

1448-
// TODO(fa): add a specialization that handles 'PySequenceArrayWrapper' instances
1451+
@Specialization(limit = "1")
1452+
static String doCStringWrapper(CStringWrapper cStringWrapper,
1453+
@CachedLibrary("cStringWrapper") PythonNativeWrapperLibrary lib) {
1454+
return cStringWrapper.getString(lib);
1455+
}
1456+
1457+
@Specialization(limit = "1")
1458+
static String doCByteArrayWrapper(CByteArrayWrapper cByteArrayWrapper,
1459+
@CachedLibrary("cByteArrayWrapper") PythonNativeWrapperLibrary lib) {
1460+
byte[] byteArray = cByteArrayWrapper.getByteArray(lib);
1461+
// TODO(fa): what is the encoding ? ASCII only ?
1462+
return PythonUtils.newString(byteArray);
1463+
}
14491464

1450-
@Specialization
1451-
PString execute(Object charPtr,
1465+
@Specialization(guards = "!isCArrayWrapper(charPtr)")
1466+
PString doPointer(Object charPtr,
14521467
@Cached PythonObjectFactory factory) {
14531468
return factory.createString(new NativeCharSequence(charPtr, 1, false));
14541469
}
1470+
1471+
static boolean isCArrayWrapper(Object object) {
1472+
return object instanceof CArrayWrapper;
1473+
}
14551474
}
14561475

14571476
// -----------------------------------------------------------------------------------------------------------------

0 commit comments

Comments
 (0)