Skip to content

Commit 3d49968

Browse files
committed
Fix usage of PyTruffle_Unicode_FromWchar.
1 parent 113fe19 commit 3d49968

File tree

3 files changed

+41
-24
lines changed

3 files changed

+41
-24
lines changed

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

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -504,14 +504,15 @@ int _PyUnicode_EqualToASCIIString( PyObject *left, const char *right) {
504504
return UPCALL_CEXT_I(_jls_PyUnicode_Compare, native_to_java(left), polyglot_from_string(right, SRC_CS)) == 0;
505505
}
506506

507+
typedef PyObject* (*unicode_fromwchar_fun_t)(void* data, long elementSize, void* errorMarker);
507508
UPCALL_ID(PyTruffle_Unicode_FromWchar);
508509
PyObject * PyUnicode_FromWideChar(const wchar_t *u, Py_ssize_t size) {
509510
#if SIZEOF_WCHAR_T == 1
510-
return UPCALL_CEXT_O(_jls_PyTruffle_Unicode_FromWchar, polyglot_from_i8_array(u, size), 1, NULL);
511+
return ((unicode_fromwchar_fun_t)_jls_PyTruffle_Unicode_FromWchar)(polyglot_from_i8_array((int8_t*)u, size), 1, NULL);
511512
#elif SIZEOF_WCHAR_T == 2
512-
return UPCALL_CEXT_O(_jls_PyTruffle_Unicode_FromWchar, polyglot_from_i32_array(u, size), 2, NULL);
513+
return ((unicode_fromwchar_fun_t)_jls_PyTruffle_Unicode_FromWchar)(polyglot_from_i8_array((int8_t*)u, size*2), 2, NULL);
513514
#elif SIZEOF_WCHAR_T == 4
514-
return UPCALL_CEXT_O(_jls_PyTruffle_Unicode_FromWchar, polyglot_from_i32_array(u, size), 4, NULL);
515+
return ((unicode_fromwchar_fun_t)_jls_PyTruffle_Unicode_FromWchar)(polyglot_from_i8_array((int8_t*)u, size*4), 4, NULL);
515516
#endif
516517
}
517518

@@ -520,20 +521,18 @@ static PyObject* _PyUnicode_FromUCS1(const Py_UCS1* u, Py_ssize_t size) {
520521
return polyglot_from_string((const char *) u, "ISO-8859-1");
521522
}
522523

523-
typedef PyObject*(*PyTruffle_Unicode_FromWchar_t)(int8_t*, int64_t, int64_t, void*);
524-
525524
static PyObject* _PyUnicode_FromUCS2(const Py_UCS2 *u, Py_ssize_t size) {
526525
// This does deliberately not use UPCALL_CEXT_O to avoid argument conversion since
527526
// 'PyTruffle_Unicode_FromWchar' really expects the bare pointer.
528527
int64_t bsize = size * sizeof(Py_UCS2);
529-
return ((PyTruffle_Unicode_FromWchar_t) _jls_PyTruffle_Unicode_FromWchar)(polyglot_from_i8_array((int8_t*)u, bsize), bsize, 2, NULL);
528+
return ((unicode_fromwchar_fun_t) _jls_PyTruffle_Unicode_FromWchar)(polyglot_from_i8_array((int8_t*)u, bsize), 2, NULL);
530529
}
531530

532531
static PyObject* _PyUnicode_FromUCS4(const Py_UCS4 *u, Py_ssize_t size) {
533532
// This does deliberately not use UPCALL_CEXT_O to avoid argument conversion since
534533
// 'PyTruffle_Unicode_FromWchar' really expects the bare pointer.
535534
int64_t bsize = size * sizeof(Py_UCS4);
536-
return ((PyTruffle_Unicode_FromWchar_t) _jls_PyTruffle_Unicode_FromWchar)(polyglot_from_i8_array((int8_t*)u, bsize), bsize, 4, NULL);
535+
return ((unicode_fromwchar_fun_t) _jls_PyTruffle_Unicode_FromWchar)(polyglot_from_i8_array((int8_t*)u, bsize), 4, NULL);
537536
}
538537

539538
// taken from CPython "Python/Objects/unicodeobject.c"

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/PythonCextBuiltins.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,16 +1019,30 @@ private PRaiseNativeNode ensureRaiseNativeNode() {
10191019
}
10201020
}
10211021

1022-
@Builtin(name = "PyTruffle_Unicode_FromWchar", minNumOfPositionalArgs = 4)
1022+
@Builtin(name = "PyTruffle_Unicode_FromWchar", minNumOfPositionalArgs = 3)
10231023
@GenerateNodeFactory
10241024
abstract static class PyTruffle_Unicode_FromWchar extends NativeUnicodeBuiltin {
10251025
@Specialization
1026-
static Object doBytes(VirtualFrame frame, Object arr, long n, long elementSize, Object errorMarker,
1027-
@Cached UnicodeFromWcharNode unicodeFromWcharNode,
1028-
@Cached CExtNodes.ToSulongNode toSulongNode,
1029-
@Cached TransformExceptionToNativeNode transformExceptionToNativeNode) {
1026+
static Object doNativeWrapper(VirtualFrame frame, PythonNativeWrapper arr, long elementSize, Object errorMarker,
1027+
@Cached CExtNodes.AsPythonObjectNode asPythonObjectNode,
1028+
@Shared("unicodeFromWcharNode") @Cached UnicodeFromWcharNode unicodeFromWcharNode,
1029+
@Shared("toSulongNode") @Cached CExtNodes.ToSulongNode toSulongNode,
1030+
@Shared("excToNativeNode") @Cached TransformExceptionToNativeNode transformExceptionToNativeNode) {
1031+
try {
1032+
return toSulongNode.execute(unicodeFromWcharNode.execute(asPythonObjectNode.execute(arr), elementSize));
1033+
} catch (PException e) {
1034+
transformExceptionToNativeNode.execute(frame, e);
1035+
return errorMarker;
1036+
}
1037+
}
1038+
1039+
@Specialization
1040+
static Object doPointer(VirtualFrame frame, Object arr, long elementSize, Object errorMarker,
1041+
@Shared("unicodeFromWcharNode") @Cached UnicodeFromWcharNode unicodeFromWcharNode,
1042+
@Shared("toSulongNode") @Cached CExtNodes.ToSulongNode toSulongNode,
1043+
@Shared("excToNativeNode") @Cached TransformExceptionToNativeNode transformExceptionToNativeNode) {
10301044
try {
1031-
return toSulongNode.execute(unicodeFromWcharNode.execute(arr, n, elementSize));
1045+
return toSulongNode.execute(unicodeFromWcharNode.execute(arr, elementSize));
10321046
} catch (PException e) {
10331047
transformExceptionToNativeNode.execute(frame, e);
10341048
return errorMarker;

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

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@
6363
import com.oracle.graal.python.nodes.PNodeWithContext;
6464
import com.oracle.graal.python.nodes.PRaiseNode;
6565
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
66+
import com.oracle.graal.python.nodes.util.CastToJavaLongNode;
67+
import com.oracle.graal.python.nodes.util.CastToJavaLongNode.CannotCastException;
6668
import com.oracle.graal.python.nodes.util.CastToJavaStringNode;
6769
import com.oracle.graal.python.runtime.PythonOptions;
6870
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
@@ -254,24 +256,25 @@ public static String getUTF32Name(int byteorder) {
254256
@ImportStatic(PythonOptions.class)
255257
public abstract static class UnicodeFromWcharNode extends PNodeWithContext {
256258

257-
public abstract String execute(Object arr, Object length, Object elementSize);
259+
public abstract String execute(Object arr, Object elementSize);
258260

259261
@Specialization(guards = "elementSize == cachedElementSize", limit = "getVariableArgumentInlineCacheLimit()")
260-
static String doBytes(Object arr, long n, long elementSize,
261-
@Cached("elementSize") long cachedElementSize,
262+
static String doBytes(Object arr, @SuppressWarnings("unused") long elementSize,
263+
@Cached(value = "elementSize", allowUncached = true) long cachedElementSize,
262264
@CachedLibrary("arr") InteropLibrary lib,
263265
@CachedLibrary(limit = "1") InteropLibrary elemLib,
264266
@Exclusive @Cached PRaiseNode raiseNode) {
265267
try {
266268
ByteBuffer bytes;
267269
if (cachedElementSize == 1L || cachedElementSize == 2L || cachedElementSize == 4L) {
268270
if (!lib.hasArrayElements(arr)) {
269-
throw raiseNode.raise(SystemError, "provided object is not an array", elementSize);
271+
throw raiseNode.raise(SystemError, "provided object is not an array", cachedElementSize);
270272
}
271-
bytes = readWithSize(lib, elemLib, arr, PInt.intValueExact(n), (int) cachedElementSize);
273+
long arraySize = lib.getArraySize(arr);
274+
bytes = readWithSize(lib, elemLib, arr, PInt.intValueExact(arraySize), (int) cachedElementSize);
272275
bytes.flip();
273276
} else {
274-
throw raiseNode.raise(ValueError, "unsupported 'wchar_t' size; was: %d", elementSize);
277+
throw raiseNode.raise(ValueError, "unsupported 'wchar_t' size; was: %d", cachedElementSize);
275278
}
276279
return decode(bytes);
277280
} catch (ArithmeticException e) {
@@ -288,14 +291,15 @@ static String doBytes(Object arr, long n, long elementSize,
288291
}
289292

290293
@Specialization(limit = "getVariableArgumentInlineCacheLimit()")
291-
static String doBytes(Object arr, PInt n, PInt elementSize,
294+
static String doBytes(Object arr, Object elementSizeObj,
295+
@Cached CastToJavaLongNode castToJavaLongNode,
292296
@CachedLibrary("arr") InteropLibrary lib,
293297
@CachedLibrary(limit = "1") InteropLibrary elemLib,
294298
@Exclusive @Cached PRaiseNode raiseNode) {
295299
try {
296-
long es = elementSize.longValueExact();
297-
return doBytes(arr, n.longValueExact(), es, es, lib, elemLib, raiseNode);
298-
} catch (ArithmeticException e) {
300+
long es = castToJavaLongNode.execute(elementSizeObj);
301+
return doBytes(arr, es, es, lib, elemLib, raiseNode);
302+
} catch (CannotCastException e) {
299303
throw raiseNode.raise(ValueError, "invalid parameters");
300304
}
301305
}

0 commit comments

Comments
 (0)