|
43 | 43 | import static com.oracle.graal.python.builtins.PythonBuiltinClassType.TypeError; |
44 | 44 | import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct; |
45 | 45 | 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; |
46 | 48 | import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject; |
47 | 49 | import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer; |
48 | 50 | import static com.oracle.graal.python.nodes.SpecialMethodNames.T___FLOAT__; |
|
55 | 57 | import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode; |
56 | 58 | import com.oracle.graal.python.builtins.objects.PNone; |
57 | 59 | 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; |
58 | 62 | import com.oracle.graal.python.builtins.objects.complex.PComplex; |
59 | | -import com.oracle.graal.python.builtins.objects.tuple.PTuple; |
60 | 63 | import com.oracle.graal.python.lib.PyObjectGetAttr; |
61 | 64 | import com.oracle.graal.python.nodes.PRaiseNode; |
62 | 65 | import com.oracle.graal.python.nodes.call.CallNode; |
|
75 | 78 |
|
76 | 79 | public final class PythonCextComplexBuiltins { |
77 | 80 |
|
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 { |
80 | 83 | @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; |
84 | 89 | } |
85 | 90 |
|
86 | 91 | @Specialization(guards = "!isPComplex(obj)") |
87 | | - static Object asComplex(Object obj, |
| 92 | + static int doGeneric(Object obj, Object out, |
88 | 93 | @Cached ComplexNode complexNode, |
89 | | - @Shared @Cached PythonObjectFactory factory) { |
| 94 | + @Shared @Cached CStructAccess.WriteDoubleNode writeDoubleNode) { |
90 | 95 | 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; |
92 | 99 | } |
93 | 100 | } |
94 | 101 |
|
|
0 commit comments