|
73 | 73 | import com.oracle.graal.python.builtins.objects.PythonAbstractObject.PInteropSubscriptNode;
|
74 | 74 | import com.oracle.graal.python.builtins.objects.bytes.PBytes;
|
75 | 75 | import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext;
|
| 76 | +import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext.LLVMType; |
76 | 77 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsPythonObjectNode;
|
77 | 78 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.CastToJavaDoubleNode;
|
78 | 79 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.CreateMethodNode;
|
79 | 80 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.FromCharPointerNode;
|
| 81 | +import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.GetLLVMType; |
80 | 82 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ResolveHandleNode;
|
81 | 83 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToNewRefNode;
|
82 | 84 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.TransformExceptionToNativeNode;
|
83 | 85 | import com.oracle.graal.python.builtins.objects.cext.capi.NativeReferenceCache.ResolveNativeReferenceNode;
|
84 | 86 | import com.oracle.graal.python.builtins.objects.cext.capi.PySequenceArrayWrapper;
|
| 87 | +import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CByteArrayWrapper; |
85 | 88 | import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes;
|
86 | 89 | import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.AsNativePrimitiveNode;
|
87 | 90 | import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.EncodeNativeStringNode;
|
@@ -1045,6 +1048,46 @@ Object execute(Object[] arguments,
|
1045 | 1048 | }
|
1046 | 1049 | }
|
1047 | 1050 |
|
| 1051 | + @ExportLibrary(InteropLibrary.class) |
| 1052 | + public static final class GraalHPyUnicodeAsUTF8AndSize extends GraalHPyContextFunction { |
| 1053 | + |
| 1054 | + @ExportMessage |
| 1055 | + Object execute(Object[] arguments, |
| 1056 | + @Cached HPyAsContextNode asContextNode, |
| 1057 | + @Cached HPyAsPythonObjectNode asPythonObjectNode, |
| 1058 | + @Cached PCallHPyFunction callFromTyped, |
| 1059 | + @Cached GetLLVMType getLLVMType, |
| 1060 | + @Cached EncodeNativeStringNode encodeNativeStringNode, |
| 1061 | + @CachedLibrary(limit = "3") InteropLibrary ptrLib, |
| 1062 | + @Cached HPyTransformExceptionToNativeNode transformExceptionToNativeNode, |
| 1063 | + @Exclusive @Cached GilNode gil) throws ArityException { |
| 1064 | + boolean mustRelease = gil.acquire(); |
| 1065 | + try { |
| 1066 | + checkArity(arguments, 3); |
| 1067 | + GraalHPyContext context = asContextNode.execute(arguments[0]); |
| 1068 | + Object unicodeObject = asPythonObjectNode.execute(context, arguments[1]); |
| 1069 | + Object sizePtr = arguments[2]; |
| 1070 | + try { |
| 1071 | + byte[] result = encodeNativeStringNode.execute(StandardCharsets.UTF_8, unicodeObject, CodecsModuleBuiltins.STRICT); |
| 1072 | + if (!ptrLib.isNull(sizePtr)) { |
| 1073 | + sizePtr = callFromTyped.call(context, GraalHPyNativeSymbol.POLYGLOT_FROM_TYPED, sizePtr, getLLVMType.execute(LLVMType.Py_ssize_ptr_t)); |
| 1074 | + try { |
| 1075 | + ptrLib.writeArrayElement(sizePtr, 0, (long) result.length); |
| 1076 | + } catch (InteropException e) { |
| 1077 | + throw CompilerDirectives.shouldNotReachHere(); |
| 1078 | + } |
| 1079 | + } |
| 1080 | + return new CByteArrayWrapper(result); |
| 1081 | + } catch (PException e) { |
| 1082 | + transformExceptionToNativeNode.execute(context, e); |
| 1083 | + return GraalHPyHandle.NULL_HANDLE; |
| 1084 | + } |
| 1085 | + } finally { |
| 1086 | + gil.release(mustRelease); |
| 1087 | + } |
| 1088 | + } |
| 1089 | + } |
| 1090 | + |
1048 | 1091 | @ExportLibrary(InteropLibrary.class)
|
1049 | 1092 | public static final class GraalHPyUnicodeFromString extends GraalHPyContextFunction {
|
1050 | 1093 |
|
|
0 commit comments