Skip to content

Commit acc1215

Browse files
committed
Refactor 'longobject.c'.
1 parent 4c19647 commit acc1215

File tree

2 files changed

+60
-57
lines changed

2 files changed

+60
-57
lines changed

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

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,15 @@
4444
PyTypeObject PyLong_Type = PY_TRUFFLE_TYPE("int", &PyType_Type, Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_LONG_SUBCLASS, offsetof(PyLongObject, ob_digit));
4545

4646
long PyLong_AsLong(PyObject *obj) {
47-
return truffle_invoke_l(PY_TRUFFLE_CEXT, "PyLong_AsPrimitive", to_java(obj), 1, sizeof(long), truffle_read_string("long"));
47+
return UPCALL_CEXT_L("PyLong_AsPrimitive", native_to_java(obj), 1, sizeof(long), polyglot_from_string("long", SRC_CS));
4848
}
4949

5050
long PyLong_AsLongAndOverflow(PyObject *obj, int *overflow) {
5151
if (obj == NULL) {
5252
PyErr_BadInternalCall();
5353
return -1;
5454
}
55-
long result = truffle_invoke_l(PY_TRUFFLE_CEXT, "PyLong_AsPrimitive", to_java(obj), 1, sizeof(long), truffle_read_string("long"));
55+
long result = UPCALL_CEXT_L("PyLong_AsPrimitive", native_to_java(obj), 1, sizeof(long), polyglot_from_string("long", SRC_CS));
5656
*overflow = result == -1L && PyErr_Occurred() != NULL;
5757
return result;
5858
}
@@ -76,22 +76,18 @@ unsigned long PyLong_AsUnsignedLong(PyObject *obj) {
7676
PyErr_BadInternalCall();
7777
return (unsigned long)-1;
7878
}
79-
return (unsigned long) truffle_invoke_l(PY_TRUFFLE_CEXT, "PyLong_AsPrimitive", to_java(obj), 0, sizeof(unsigned long), truffle_read_string("unsigned long"));
79+
return (unsigned long) UPCALL_CEXT_L("PyLong_AsPrimitive", native_to_java(obj), 0, sizeof(unsigned long), polyglot_from_string("unsigned long", SRC_CS));
8080
}
8181
PyObject * PyLong_FromSsize_t(Py_ssize_t n) {
8282
return PyLong_FromLongLong(n);
8383
}
8484

8585
PyObject * PyLong_FromDouble(double n) {
86-
PyObject *result = truffle_invoke(PY_TRUFFLE_CEXT, "PyLong_FromLongLong", n, 1);
87-
if (result == ERROR_MARKER) {
88-
return NULL;
89-
}
90-
return to_sulong(result);
86+
return UPCALL_CEXT_O("PyLong_FromLongLong", n, 1);
9187
}
9288

9389
Py_ssize_t PyLong_AsSsize_t(PyObject *obj) {
94-
return truffle_invoke_l(PY_TRUFFLE_CEXT, "PyLong_AsPrimitive", to_java(obj), 1, sizeof(Py_ssize_t), truffle_read_string("ssize_t"));
90+
return UPCALL_CEXT_L("PyLong_AsPrimitive", native_to_java(obj), 1, sizeof(Py_ssize_t), polyglot_from_string("ssize_t", SRC_CS));
9591
}
9692

9793
PyObject * PyLong_FromVoidPtr(void *p) {
@@ -118,27 +114,19 @@ PyObject * PyLong_FromLong(long n) {
118114
}
119115

120116
PyObject * PyLong_FromLongLong(long long n) {
121-
PyObject *result = truffle_invoke(PY_TRUFFLE_CEXT, "PyLong_FromLongLong", n, 1);
122-
if (result == ERROR_MARKER) {
123-
return NULL;
124-
}
125-
return to_sulong(result);
117+
return UPCALL_CEXT_O("PyLong_FromLongLong", n, 1);
126118
}
127119

128120
PyObject * PyLong_FromUnsignedLong(unsigned long n) {
129121
return PyLong_FromUnsignedLongLong(n);
130122
}
131123

132124
PyObject * PyLong_FromUnsignedLongLong(unsigned long long n) {
133-
PyObject *result = truffle_invoke(PY_TRUFFLE_CEXT, "PyLong_FromLongLong", n, 0);
134-
if (result == ERROR_MARKER) {
135-
return NULL;
136-
}
137-
return to_sulong(result);
125+
return UPCALL_CEXT_O("PyLong_FromLongLong", n, 0);
138126
}
139127

140128
int _PyLong_Sign(PyObject *vv) {
141-
return truffle_invoke_i(PY_TRUFFLE_CEXT, "_PyLong_Sign", to_java(vv));
129+
return UPCALL_CEXT_I("_PyLong_Sign", native_to_java(vv));
142130
}
143131

144132
PyObject * PyLong_FromSize_t(size_t n) {

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

Lines changed: 52 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -782,60 +782,75 @@ protected static String getUTF32Name(int byteorder) {
782782
@GenerateNodeFactory
783783
abstract static class TrufflePInt_AsPrimitive extends NativeBuiltin {
784784

785-
@Specialization
786-
Object doPInt(int obj, int signed, long targetTypeSize, @SuppressWarnings("unused") String targetTypeName) {
787-
if (targetTypeSize == 4) {
785+
@Specialization(guards = "targetTypeSize == 4")
786+
int doInt4(int obj, @SuppressWarnings("unused") int signed, @SuppressWarnings("unused") long targetTypeSize, @SuppressWarnings("unused") String targetTypeName) {
787+
return obj;
788+
}
789+
790+
@Specialization(guards = "targetTypeSize == 8")
791+
long doInt8(int obj, int signed, @SuppressWarnings("unused") long targetTypeSize, @SuppressWarnings("unused") String targetTypeName) {
792+
if (signed != 0) {
788793
return obj;
789-
} else if (targetTypeSize == 8) {
790-
if (signed != 0) {
791-
return (long) obj;
792-
} else {
793-
return obj & 0xFFFFFFFFL;
794-
}
795794
} else {
796-
return raiseNative(-1, PythonErrorType.SystemError, "Unsupported target size: %d", targetTypeSize);
795+
return obj & 0xFFFFFFFFL;
797796
}
798797
}
799798

800-
@Specialization
801-
Object doPInt(long obj, @SuppressWarnings("unused") int signed, long targetTypeSize, String targetTypeName) {
802-
if (targetTypeSize == 4) {
799+
@Specialization(guards = {"targetTypeSize != 4", "targetTypeSize != 8"})
800+
int doIntOther(@SuppressWarnings("unused") int obj, @SuppressWarnings("unused") int signed, long targetTypeSize, @SuppressWarnings("unused") String targetTypeName) {
801+
return raiseNative(-1, PythonErrorType.SystemError, "Unsupported target size: %d", targetTypeSize);
802+
}
803+
804+
@Specialization(guards = "targetTypeSize == 4")
805+
int doLong4(@SuppressWarnings("unused") long obj, @SuppressWarnings("unused") int signed, @SuppressWarnings("unused") long targetTypeSize, String targetTypeName) {
806+
return raiseNative(-1, PythonErrorType.OverflowError, "Python int too large to convert to C %s", targetTypeName);
807+
}
808+
809+
@Specialization(guards = "targetTypeSize == 8")
810+
long doLong8(long obj, @SuppressWarnings("unused") int signed, @SuppressWarnings("unused") long targetTypeSize, @SuppressWarnings("unused") String targetTypeName) {
811+
return obj;
812+
}
813+
814+
@Specialization(guards = {"targetTypeSize != 4", "targetTypeSize != 8"})
815+
int doPInt(@SuppressWarnings("unused") long obj, @SuppressWarnings("unused") int signed, long targetTypeSize, @SuppressWarnings("unused") String targetTypeName) {
816+
return raiseNative(-1, PythonErrorType.SystemError, "Unsupported target size: %d", targetTypeSize);
817+
}
818+
819+
@Specialization(guards = "targetTypeSize == 4")
820+
int doPInt4(PInt obj, int signed, @SuppressWarnings("unused") long targetTypeSize, String targetTypeName) {
821+
try {
822+
if (signed != 0) {
823+
return obj.intValueExact();
824+
} else if (obj.bitCount() <= 32) {
825+
return obj.intValue();
826+
} else {
827+
throw new ArithmeticException();
828+
}
829+
} catch (ArithmeticException e) {
803830
return raiseNative(-1, PythonErrorType.OverflowError, "Python int too large to convert to C %s", targetTypeName);
804-
} else if (targetTypeSize == 8) {
805-
return obj;
806-
} else {
807-
return raiseNative(-1, PythonErrorType.SystemError, "Unsupported target size: %d", targetTypeSize);
808831
}
809832
}
810833

811-
@Specialization
812-
Object doPInt(PInt obj, int signed, long targetTypeSize, String targetTypeName) {
834+
@Specialization(guards = "targetTypeSize == 8")
835+
long doPInt8(PInt obj, int signed, @SuppressWarnings("unused") long targetTypeSize, String targetTypeName) {
813836
try {
814-
if (targetTypeSize == 4) {
815-
if (signed != 0) {
816-
return obj.intValueExact();
817-
} else if (obj.bitCount() <= 32) {
818-
return obj.intValue();
819-
} else {
820-
throw new ArithmeticException();
821-
}
822-
} else if (targetTypeSize == 8) {
823-
if (signed != 0) {
824-
return obj.longValueExact();
825-
} else if (obj.bitCount() <= 64) {
826-
return obj.longValue();
827-
} else {
828-
throw new ArithmeticException();
829-
}
837+
if (signed != 0) {
838+
return obj.longValueExact();
839+
} else if (obj.bitCount() <= 64) {
840+
return obj.longValue();
830841
} else {
831-
return raiseNative(-1, PythonErrorType.SystemError, "Unsupported target size: %d", targetTypeSize);
842+
throw new ArithmeticException();
832843
}
833-
834844
} catch (ArithmeticException e) {
835845
return raiseNative(-1, PythonErrorType.OverflowError, "Python int too large to convert to C %s", targetTypeName);
836846
}
837847
}
838848

849+
@Specialization(guards = {"targetTypeSize != 4", "targetTypeSize != 8"})
850+
int doPInt(@SuppressWarnings("unused") PInt obj, @SuppressWarnings("unused") int signed, long targetTypeSize, @SuppressWarnings("unused") String targetTypeName) {
851+
return raiseNative(-1, PythonErrorType.SystemError, "Unsupported target size: %d", targetTypeSize);
852+
}
853+
839854
@Specialization(guards = {"!isInteger(obj)", "!isPInt(obj)"})
840855
@SuppressWarnings("unused")
841856
int doGeneric(Object obj, boolean signed, int targetTypeSize, String targetTypeName) {

0 commit comments

Comments
 (0)