Skip to content

Commit bf8059a

Browse files
committed
Implement Python-level object for handling pointer objects.
1 parent e313e0d commit bf8059a

File tree

7 files changed

+101
-2
lines changed

7 files changed

+101
-2
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,10 @@ PyObject * PyLong_FromVoidPtr(void *p) {
106106
return PyLong_FromUnsignedLongLong((unsigned long long)(uintptr_t)p);
107107
#endif /* SIZEOF_VOID_P <= SIZEOF_LONG */
108108
}
109+
110+
UPCALL_ID(PyLong_AsVoidPtr);
109111
void * PyLong_AsVoidPtr(PyObject *obj){
110-
return (void *)PyLong_AsSsize_t(obj);
112+
return (void *)UPCALL_CEXT_L(_jls_PyLong_AsVoidPtr, native_to_java(obj));
111113
}
112114

113115
PyObject * PyLong_FromLong(long n) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ public enum PythonBuiltinClassType {
5959
PGenerator(com.oracle.graal.python.builtins.objects.generator.PGenerator.class, "generator"),
6060
PGeneratorFunction(com.oracle.graal.python.builtins.objects.function.PGeneratorFunction.class, "function"),
6161
PInt(com.oracle.graal.python.builtins.objects.ints.PInt.class, "int"),
62+
PythonNativeVoidPtr(com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr.class, "int"),
6263
PIntegerSequenceIterator(com.oracle.graal.python.builtins.objects.iterator.PIntegerSequenceIterator.class, "iterator"),
6364
PList(com.oracle.graal.python.builtins.objects.list.PList.class, "list"),
6465
PLongSequenceIterator(com.oracle.graal.python.builtins.objects.iterator.PLongSequenceIterator.class, "iterator"),

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

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
*/
4141
package com.oracle.graal.python.builtins.modules;
4242

43+
import static com.oracle.graal.python.runtime.exception.PythonErrorType.OverflowError;
4344
import static com.oracle.graal.python.runtime.exception.PythonErrorType.SystemError;
4445
import static com.oracle.graal.python.runtime.exception.PythonErrorType.TypeError;
4546

@@ -60,6 +61,7 @@
6061
import com.oracle.graal.python.builtins.PythonBuiltins;
6162
import com.oracle.graal.python.builtins.modules.TruffleCextBuiltinsFactory.CheckFunctionResultNodeGen;
6263
import com.oracle.graal.python.builtins.modules.TruffleCextBuiltinsFactory.GetByteArrayNodeGen;
64+
import com.oracle.graal.python.builtins.modules.TruffleCextBuiltinsFactory.TrufflePInt_AsPrimitiveFactory;
6365
import com.oracle.graal.python.builtins.objects.PNone;
6466
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
6567
import com.oracle.graal.python.builtins.objects.bytes.BytesBuiltins;
@@ -84,6 +86,7 @@
8486
import com.oracle.graal.python.builtins.objects.cext.NativeWrappers.PythonObjectNativeWrapper;
8587
import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
8688
import com.oracle.graal.python.builtins.objects.cext.PythonNativeNull;
89+
import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr;
8790
import com.oracle.graal.python.builtins.objects.cext.UnicodeObjectNodes.UnicodeAsWideCharNode;
8891
import com.oracle.graal.python.builtins.objects.code.PCode;
8992
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes;
@@ -836,6 +839,12 @@ protected static String getUTF32Name(int byteorder) {
836839
@GenerateNodeFactory
837840
abstract static class TrufflePInt_AsPrimitive extends NativeBuiltin {
838841

842+
public abstract Object executeWith(Object o, int signed, long targetTypeSize, String targetTypeName);
843+
844+
public abstract long executeLong(Object o, int signed, long targetTypeSize, String targetTypeName);
845+
846+
public abstract int executeInt(Object o, int signed, long targetTypeSize, String targetTypeName);
847+
839848
@Specialization(guards = "targetTypeSize == 4")
840849
int doInt4(int obj, @SuppressWarnings("unused") int signed, @SuppressWarnings("unused") long targetTypeSize, @SuppressWarnings("unused") String targetTypeName) {
841850
return obj;
@@ -1897,5 +1906,52 @@ Object doUnsignedLong(long n, @SuppressWarnings("unused") int signed,
18971906
}
18981907
return toSulongNode.execute(n);
18991908
}
1909+
1910+
@Specialization
1911+
Object doPointer(TruffleObject n, @SuppressWarnings("unused") int signed,
1912+
@Cached("create()") CExtNodes.ToSulongNode toSulongNode) {
1913+
return toSulongNode.execute(n);
1914+
}
1915+
}
1916+
1917+
@Builtin(name = "PyLong_AsVoidPtr", fixedNumOfPositionalArgs = 1)
1918+
@GenerateNodeFactory
1919+
abstract static class PyLong_AsVoidPtr extends PythonUnaryBuiltinNode {
1920+
@Child private TrufflePInt_AsPrimitive asPrimitiveNode;
1921+
1922+
@Specialization
1923+
long doPointer(int n) {
1924+
return n;
1925+
}
1926+
1927+
@Specialization
1928+
long doPointer(long n) {
1929+
return n;
1930+
}
1931+
1932+
@Specialization
1933+
long doPointer(PInt n,
1934+
@Cached("create()") BranchProfile overflowProfile) {
1935+
try {
1936+
return n.longValueExact();
1937+
} catch (ArithmeticException e) {
1938+
overflowProfile.enter();
1939+
throw raise(OverflowError);
1940+
}
1941+
}
1942+
1943+
@Specialization
1944+
TruffleObject doPointer(PythonNativeVoidPtr n) {
1945+
return n.object;
1946+
}
1947+
1948+
@Fallback
1949+
long doGeneric(Object n) {
1950+
if (asPrimitiveNode == null) {
1951+
CompilerDirectives.transferToInterpreterAndInvalidate();
1952+
asPrimitiveNode = insert(TrufflePInt_AsPrimitiveFactory.create(null));
1953+
}
1954+
return asPrimitiveNode.executeLong(n, 0, Long.BYTES, "void*");
1955+
}
19001956
}
19011957
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.oracle.graal.python.builtins.objects.cext;
2+
3+
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
4+
import com.oracle.truffle.api.interop.TruffleObject;
5+
6+
public class PythonNativeVoidPtr extends PythonAbstractObject {
7+
public final TruffleObject object;
8+
9+
public PythonNativeVoidPtr(TruffleObject object) {
10+
this.object = object;
11+
}
12+
13+
public int compareTo(Object o) {
14+
return 0;
15+
}
16+
17+
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/ints/IntBuiltins.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import com.oracle.graal.python.builtins.objects.bytes.PBytes;
5656
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.FromNativeSubclassNode;
5757
import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject;
58+
import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr;
5859
import com.oracle.graal.python.builtins.objects.type.PythonClass;
5960
import com.oracle.graal.python.nodes.SpecialMethodNames;
6061
import com.oracle.graal.python.nodes.call.special.LookupAndCallBinaryNode;
@@ -1695,10 +1696,15 @@ long hash(long self) {
16951696
}
16961697

16971698
@Specialization
1698-
@TruffleBoundary
16991699
long hash(PInt self) {
17001700
return self.longValue();
17011701
}
1702+
1703+
@Specialization
1704+
@TruffleBoundary
1705+
long hash(PythonNativeVoidPtr self) {
1706+
return self.object.hashCode();
1707+
}
17021708
}
17031709

17041710
@Builtin(name = "bit_length", fixedNumOfPositionalArgs = 1)

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/GetClassNode.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import com.oracle.graal.python.builtins.objects.PNotImplemented;
4848
import com.oracle.graal.python.builtins.objects.cext.CExtNodes.GetNativeClassNode;
4949
import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject;
50+
import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr;
5051
import com.oracle.graal.python.builtins.objects.getsetdescriptor.GetSetDescriptor;
5152
import com.oracle.graal.python.builtins.objects.object.PythonObject;
5253
import com.oracle.graal.python.builtins.objects.type.PythonClass;
@@ -205,6 +206,17 @@ protected PythonClass getIt(PythonNativeObject object,
205206
return getNativeClassNode.execute(object);
206207
}
207208

209+
@Specialization(assumptions = "singleContextAssumption()")
210+
protected PythonClass getIt(@SuppressWarnings("unused") PythonNativeVoidPtr object,
211+
@Cached("getIt(object)") PythonClass klass) {
212+
return klass;
213+
}
214+
215+
@Specialization
216+
protected PythonClass getIt(@SuppressWarnings("unused") PythonNativeVoidPtr object) {
217+
return getCore().lookupType(PythonBuiltinClassType.PInt);
218+
}
219+
208220
@Specialization
209221
protected PythonClass getPythonClassGeneric(PythonObject object,
210222
@Cached("createIdentityProfile()") ValueProfile profile) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/object/PythonObjectFactory.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import com.oracle.graal.python.builtins.objects.cell.PCell;
3838
import com.oracle.graal.python.builtins.objects.cext.PythonNativeClass;
3939
import com.oracle.graal.python.builtins.objects.cext.PythonNativeObject;
40+
import com.oracle.graal.python.builtins.objects.cext.PythonNativeVoidPtr;
4041
import com.oracle.graal.python.builtins.objects.code.PCode;
4142
import com.oracle.graal.python.builtins.objects.common.DynamicObjectStorage.FastDictStorage;
4243
import com.oracle.graal.python.builtins.objects.common.DynamicObjectStorage.PythonObjectDictStorage;
@@ -188,6 +189,10 @@ public PythonNativeObject createNativeObjectWrapper(Object obj) {
188189
return trace(new PythonNativeObject(obj));
189190
}
190191

192+
public PythonNativeVoidPtr createNativeVoidPtr(TruffleObject obj) {
193+
return trace(new PythonNativeVoidPtr(obj));
194+
}
195+
191196
public SuperObject createSuperObject(PythonClass self) {
192197
return trace(new SuperObject(self));
193198
}

0 commit comments

Comments
 (0)