Skip to content

Commit ea736fa

Browse files
committed
Implement HPy context function ctx_Unicode_AsUTF8AndSize
1 parent 5d1a198 commit ea736fa

File tree

4 files changed

+52
-0
lines changed

4 files changed

+52
-0
lines changed

graalpython/com.oracle.graal.python.cext/hpy/hpy.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,6 +1155,10 @@ HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_AsUTF8String)(HPyContext *ctx, HPy h)
11551155
return UPCALL_HPY(ctx_Unicode_AsUTF8String, ctx, h);
11561156
}
11571157

1158+
HPyAPI_STORAGE const char *_HPy_IMPL_NAME(Unicode_AsUTF8AndSize)(HPyContext *ctx, HPy h, HPy_ssize_t *size) {
1159+
return UPCALL_CHARPTR(ctx_Unicode_AsUTF8AndSize, ctx, h, size);
1160+
}
1161+
11581162
HPyAPI_STORAGE HPy _HPy_IMPL_NAME(Unicode_FromWideChar)(HPyContext *ctx, const wchar_t *w, HPy_ssize_t size)
11591163
{
11601164
return UPCALL_HPY(ctx_Unicode_FromWideChar, ctx, w, size);
@@ -1461,6 +1465,7 @@ HPyContext *graal_hpy_context_to_native(HPyContext *managed_context) {
14611465
HPY_CTX_UPCALL(ctx_Unicode_FromString);
14621466
HPY_CTX_UPCALL(ctx_Unicode_Check);
14631467
HPY_CTX_UPCALL(ctx_Unicode_AsUTF8String);
1468+
HPY_CTX_UPCALL(ctx_Unicode_AsUTF8AndSize);
14641469
HPY_CTX_UPCALL(ctx_Unicode_FromWideChar);
14651470
HPY_CTX_UPCALL(ctx_List_Check);
14661471
HPY_CTX_UPCALL(ctx_List_New);

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@
194194
import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions.GraalHPyTypeFromSpec;
195195
import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions.GraalHPyTypeGenericNew;
196196
import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions.GraalHPyUnaryArithmetic;
197+
import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions.GraalHPyUnicodeAsUTF8AndSize;
197198
import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions.GraalHPyUnicodeAsUTF8String;
198199
import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions.GraalHPyUnicodeFromString;
199200
import com.oracle.graal.python.builtins.objects.cext.hpy.GraalHPyContextFunctions.GraalHPyUnicodeFromWchar;
@@ -559,6 +560,7 @@ enum HPyContextMember {
559560
CTX_UNICODE_FROMSTRING("ctx_Unicode_FromString"),
560561
CTX_UNICODE_CHECK("ctx_Unicode_Check"),
561562
CTX_UNICODE_ASUTF8STRING("ctx_Unicode_AsUTF8String"),
563+
CTX_UNICODE_ASUTF8ANDSIZE("ctx_Unicode_AsUTF8AndSize"),
562564
CTX_UNICODE_FROMWIDECHAR("ctx_Unicode_FromWideChar"),
563565
CTX_LIST_NEW("ctx_List_New"),
564566
CTX_LIST_APPEND("ctx_List_Append"),
@@ -1264,6 +1266,7 @@ private static Object[] createMembers(PythonContext context, String name) {
12641266
members[HPyContextMember.CTX_UNICODE_CHECK.ordinal()] = new GraalHPyCheckBuiltinType(PString);
12651267
members[HPyContextMember.CTX_ISTRUE.ordinal()] = new GraalHPyIsTrue();
12661268
members[HPyContextMember.CTX_UNICODE_ASUTF8STRING.ordinal()] = new GraalHPyUnicodeAsUTF8String();
1269+
members[HPyContextMember.CTX_UNICODE_ASUTF8ANDSIZE.ordinal()] = new GraalHPyUnicodeAsUTF8AndSize();
12671270
members[HPyContextMember.CTX_UNICODE_FROMSTRING.ordinal()] = new GraalHPyUnicodeFromString();
12681271
members[HPyContextMember.CTX_UNICODE_FROMWIDECHAR.ordinal()] = new GraalHPyUnicodeFromWchar();
12691272
members[HPyContextMember.CTX_TYPE_FROM_SPEC.ordinal()] = new GraalHPyTypeFromSpec();

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

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,18 @@
7373
import com.oracle.graal.python.builtins.objects.PythonAbstractObject.PInteropSubscriptNode;
7474
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
7575
import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext;
76+
import com.oracle.graal.python.builtins.objects.cext.capi.CApiContext.LLVMType;
7677
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.AsPythonObjectNode;
7778
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.CastToJavaDoubleNode;
7879
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.CreateMethodNode;
7980
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.FromCharPointerNode;
81+
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.GetLLVMType;
8082
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ResolveHandleNode;
8183
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.ToNewRefNode;
8284
import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes.TransformExceptionToNativeNode;
8385
import com.oracle.graal.python.builtins.objects.cext.capi.NativeReferenceCache.ResolveNativeReferenceNode;
8486
import com.oracle.graal.python.builtins.objects.cext.capi.PySequenceArrayWrapper;
87+
import com.oracle.graal.python.builtins.objects.cext.common.CArrayWrappers.CByteArrayWrapper;
8588
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes;
8689
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.AsNativePrimitiveNode;
8790
import com.oracle.graal.python.builtins.objects.cext.common.CExtCommonNodes.EncodeNativeStringNode;
@@ -1045,6 +1048,46 @@ Object execute(Object[] arguments,
10451048
}
10461049
}
10471050

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+
10481091
@ExportLibrary(InteropLibrary.class)
10491092
public static final class GraalHPyUnicodeFromString extends GraalHPyContextFunction {
10501093

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
public enum GraalHPyNativeSymbol implements NativeCExtSymbol {
4848

4949
POLYGLOT_FROM_STRING("polyglot_from_string"),
50+
POLYGLOT_FROM_TYPED("polyglot_from_typed"),
5051

5152
GRAAL_HPY_ALLOCATE_BUFFER("graal_hpy_allocate_buffer"),
5253
GRAAL_HPY_BUFFER_TO_NATIVE("graal_hpy_buffer_to_native"),

0 commit comments

Comments
 (0)