Skip to content

Commit 9ec9943

Browse files
committed
Improve PyComplex_AsCComplex
1 parent e51214d commit 9ec9943

File tree

4 files changed

+27
-20
lines changed

4 files changed

+27
-20
lines changed

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

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -324,18 +324,14 @@ PyComplex_AsCComplex(PyObject *op)
324324
// GraalPy change: different implementation
325325
/* If op is already of type PyComplex_Type, return its value */
326326
if (!points_to_py_handle_space(op) && PyComplex_Check(op)) {
327-
return ((PyComplexObject *)op)->cval;
327+
return ((PyComplexObject*) op)->cval;
328328
}
329-
PyObject* parts = GraalPyTruffleComplex_AsCComplex(op);
330-
Py_complex result;
331-
if(parts != NULL) {
332-
result.real = PyFloat_AsDouble(PyTuple_GetItem(parts, 0));
333-
result.imag = PyFloat_AsDouble(PyTuple_GetItem(parts, 1));
334-
Py_DecRef(parts);
335-
return result;
336-
}
337-
Py_complex c_error = {-1., 0.};
338-
return c_error;
329+
Py_complex result;
330+
if (GraalPyTruffleComplex_AsCComplex(op, &result) == 0) {
331+
return result;
332+
}
333+
Py_complex c_error = { -1., 0. };
334+
return c_error;
339335
}
340336

341337
#if 0 // GraalPy change

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/cext/PythonCextComplexBuiltins.java

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError;
4444
import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct;
4545
import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Ignored;
46+
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int;
47+
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Pointer;
4648
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject;
4749
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer;
4850
import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOAT__;
@@ -55,8 +57,9 @@
5557
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode;
5658
import com.oracle.graal.python.builtins.objects.PNone;
5759
import com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor;
60+
import com.oracle.graal.python.builtins.objects.cext.structs.CFields;
61+
import com.oracle.graal.python.builtins.objects.cext.structs.CStructAccess;
5862
import com.oracle.graal.python.builtins.objects.complex.PComplex;
59-
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
6063
import com.oracle.graal.python.lib.PyObjectGetAttr;
6164
import com.oracle.graal.python.nodes.PRaiseNode;
6265
import com.oracle.graal.python.nodes.call.CallNode;
@@ -75,20 +78,24 @@
7578

7679
public final class PythonCextComplexBuiltins {
7780

78-
@CApiBuiltin(ret = PyObjectTransfer, args = {PyObject}, call = Ignored)
79-
abstract static class PyTruffleComplex_AsCComplex extends CApiUnaryBuiltinNode {
81+
@CApiBuiltin(ret = Int, args = {PyObject, Pointer}, call = Ignored)
82+
abstract static class PyTruffleComplex_AsCComplex extends CApiBinaryBuiltinNode {
8083
@Specialization
81-
static PTuple asComplex(PComplex c,
82-
@Shared @Cached PythonObjectFactory factory) {
83-
return factory.createTuple(new Object[]{c.getReal(), c.getImag()});
84+
static int asComplex(PComplex c, Object out,
85+
@Shared @Cached CStructAccess.WriteDoubleNode writeDoubleNode) {
86+
writeDoubleNode.write(out, CFields.Py_complex__real, c.getReal());
87+
writeDoubleNode.write(out, CFields.Py_complex__imag, c.getImag());
88+
return 0;
8489
}
8590

8691
@Specialization(guards = "!isPComplex(obj)")
87-
static Object asComplex(Object obj,
92+
static int doGeneric(Object obj, Object out,
8893
@Cached ComplexNode complexNode,
89-
@Shared @Cached PythonObjectFactory factory) {
94+
@Shared @Cached CStructAccess.WriteDoubleNode writeDoubleNode) {
9095
PComplex c = (PComplex) complexNode.execute(null, PythonBuiltinClassType.PComplex, obj, PNone.NO_VALUE);
91-
return factory.createTuple(new Object[]{c.getReal(), c.getImag()});
96+
writeDoubleNode.write(out, CFields.Py_complex__real, c.getReal());
97+
writeDoubleNode.write(out, CFields.Py_complex__imag, c.getImag());
98+
return 0;
9299
}
93100
}
94101

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CFields.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,9 @@ public enum CFields {
304304

305305
PyModuleDef_Base__m_index(Py_ssize_t),
306306

307+
Py_complex__real(Double),
308+
Py_complex__imag(Double),
309+
307310
PyComplexObject__cval__real(Double),
308311
PyComplexObject__cval__imag(Double),
309312

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/structs/CStructs.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public enum CStructs {
7474
GraalPyFloatObject,
7575
PyLongObject,
7676
PyModuleDef_Base,
77+
Py_complex,
7778
PyComplexObject,
7879
PyDateTime_Date,
7980
PyDateTime_Time,

0 commit comments

Comments
 (0)