|
41 | 41 | package com.oracle.graal.python.builtins.modules.ctypes.memory;
|
42 | 42 |
|
43 | 43 | import static com.oracle.graal.python.builtins.PythonBuiltinClassType.NotImplementedError;
|
| 44 | +import static com.oracle.graal.python.builtins.PythonBuiltinClassType.OverflowError; |
44 | 45 | import static com.oracle.graal.python.builtins.modules.ctypes.CtypesNodes.WCHAR_T_SIZE;
|
45 | 46 | import static com.oracle.graal.python.util.PythonUtils.ARRAY_ACCESSOR;
|
46 | 47 |
|
| 48 | +import java.math.BigInteger; |
| 49 | + |
47 | 50 | import com.oracle.graal.python.builtins.modules.ctypes.memory.Pointer.ByteArrayStorage;
|
48 | 51 | import com.oracle.graal.python.builtins.modules.ctypes.memory.Pointer.LongPointerStorage;
|
49 | 52 | import com.oracle.graal.python.builtins.modules.ctypes.memory.Pointer.MemoryBlock;
|
|
58 | 61 | import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr;
|
59 | 62 | import com.oracle.graal.python.builtins.objects.cext.capi.CExtNodes;
|
60 | 63 | import com.oracle.graal.python.builtins.objects.cext.capi.transitions.CApiTransitions;
|
| 64 | +import com.oracle.graal.python.builtins.objects.ints.PInt; |
61 | 65 | import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView;
|
62 | 66 | import com.oracle.graal.python.nodes.ErrorMessages;
|
63 | 67 | import com.oracle.graal.python.nodes.PRaiseNode;
|
64 |
| -import com.oracle.graal.python.nodes.util.CastToJavaUnsignedLongNode; |
65 | 68 | import com.oracle.graal.python.runtime.PythonContext;
|
66 | 69 | import com.oracle.graal.python.util.PythonUtils;
|
67 | 70 | import com.oracle.truffle.api.CompilerDirectives;
|
68 | 71 | import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
|
| 72 | +import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff; |
69 | 73 | import com.oracle.truffle.api.dsl.Cached;
|
70 | 74 | import com.oracle.truffle.api.dsl.Fallback;
|
71 | 75 | import com.oracle.truffle.api.dsl.GenerateCached;
|
@@ -790,11 +794,36 @@ static Pointer doNativeVoidPtr(PythonNativeVoidPtr value) {
|
790 | 794 | return Pointer.nativeMemory(pointerObject);
|
791 | 795 | }
|
792 | 796 |
|
793 |
| - @Fallback |
794 |
| - static Pointer doLong(Node inliningTarget, Object value, |
795 |
| - @Cached CastToJavaUnsignedLongNode cast) { |
796 |
| - long pointer = cast.execute(inliningTarget, value); |
797 |
| - return Pointer.nativeMemory(pointer); |
| 797 | + @Specialization |
| 798 | + static Pointer doBool(Node inliningTarget, boolean value) { |
| 799 | + return Pointer.nativeMemory(value ? 1 : 0); |
| 800 | + } |
| 801 | + |
| 802 | + @Specialization |
| 803 | + static Pointer doLong(Node inliningTarget, long value) { |
| 804 | + return Pointer.nativeMemory(value); |
| 805 | + } |
| 806 | + |
| 807 | + @Specialization |
| 808 | + static Pointer doPInt(Node inliningTarget, PInt value) { |
| 809 | + return Pointer.nativeMemory(value.longValue()); |
| 810 | + } |
| 811 | + |
| 812 | + @Specialization |
| 813 | + @TruffleBoundary |
| 814 | + @InliningCutoff |
| 815 | + static Pointer doGeneric(Node inliningTarget, Object value, |
| 816 | + @CachedLibrary(limit = "1") InteropLibrary lib) { |
| 817 | + if (lib.fitsInBigInteger(value)) { |
| 818 | + BigInteger bi; |
| 819 | + try { |
| 820 | + bi = lib.asBigInteger(value); |
| 821 | + return doLong(inliningTarget, bi.longValue()); |
| 822 | + } catch (UnsupportedMessageException e) { |
| 823 | + // fall through to error |
| 824 | + } |
| 825 | + } |
| 826 | + throw PRaiseNode.raiseStatic(inliningTarget, OverflowError, ErrorMessages.CANNOT_BE_CONVERTED_TO_POINTER); |
798 | 827 | }
|
799 | 828 | }
|
800 | 829 |
|
|
0 commit comments