|
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