Skip to content

Commit 1ee1dbf

Browse files
committed
Borrow tzinfo from PyDateTime_DATE_GET_TZINFO
1 parent b2f0564 commit 1ee1dbf

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

graalpython/com.oracle.graal.python.cext/include/datetime.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,12 @@ typedef struct
119119
} PyDateTime_DateTime; /* hastzinfo true */
120120

121121

122+
PyObject* PyTruffle_PyDateTime_GET_TZINFO(PyObject*);
123+
122124
/* Apply for date and datetime instances. */
123125

124126
// o is a pointer to a time or a datetime object.
125-
#define _PyDateTime_HAS_TZINFO(o) (((_PyDateTime_BaseTZInfo *)(o))->hastzinfo)
127+
#define _PyDateTime_HAS_TZINFO(o) (PyTruffle_PyDateTime_GET_TZINFO((PyObject*)o) != Py_None)
126128

127129
#define PyDateTime_GET_YEAR(o) ((int)PyLong_AsLong(PyObject_GetAttrString((PyObject*)o, "year")))
128130
#define PyDateTime_GET_MONTH(o) ((unsigned char)PyLong_AsLong(PyObject_GetAttrString((PyObject*)o, "month")))
@@ -133,17 +135,15 @@ typedef struct
133135
#define PyDateTime_DATE_GET_SECOND(o) ((unsigned char)PyLong_AsLong(PyObject_GetAttrString((PyObject*)o, "second")))
134136
#define PyDateTime_DATE_GET_MICROSECOND(o) ((int)PyLong_AsLong(PyObject_GetAttrString((PyObject*)o, "microsecond")))
135137
#define PyDateTime_DATE_GET_FOLD(o) ((unsigned char)PyLong_AsLong(PyObject_GetAttrString((PyObject*)o, "fold")))
136-
// TODO borrow
137-
#define PyDateTime_DATE_GET_TZINFO(o) (PyObject_GetAttrString((PyObject*)o, "tzinfo"))
138+
#define PyDateTime_DATE_GET_TZINFO(o) (PyTruffle_PyDateTime_GET_TZINFO((PyObject*)o))
138139

139140
/* Apply for time instances. */
140141
#define PyDateTime_TIME_GET_HOUR(o) ((unsigned char)PyLong_AsLong(PyObject_GetAttrString((PyObject*)o, "hour")))
141142
#define PyDateTime_TIME_GET_MINUTE(o) ((unsigned char)PyLong_AsLong(PyObject_GetAttrString((PyObject*)o, "minute")))
142143
#define PyDateTime_TIME_GET_SECOND(o) ((unsigned char)PyLong_AsLong(PyObject_GetAttrString((PyObject*)o, "second")))
143144
#define PyDateTime_TIME_GET_MICROSECOND(o) ((int)PyLong_AsLong(PyObject_GetAttrString((PyObject*)o, "microsecond")))
144145
#define PyDateTime_TIME_GET_FOLD(o) ((unsigned char)PyLong_AsLong(PyObject_GetAttrString((PyObject*)o, "fold")))
145-
// TODO borrow
146-
#define PyDateTime_TIME_GET_TZINFO(o) (PyObject_GetAttrString((PyObject*)o, "tzinfo"))
146+
#define PyDateTime_TIME_GET_TZINFO(o) (PyTruffle_PyDateTime_GET_TZINFO((PyObject*)o))
147147

148148
/* Apply for time delta instances */
149149
#define PyDateTime_DELTA_GET_DAYS(o) ((int)PyLong_AsLong(PyObject_GetAttrString((PyObject*)o, "days")))

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

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

43+
import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Direct;
4344
import static com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiCallPath.Ignored;
4445
import static com.oracle.graal.python.builtins.objects.cext.capi.PyDateTimeCAPIWrapper.T_FOLD;
4546
import static com.oracle.graal.python.builtins.objects.cext.capi.PyDateTimeCAPIWrapper.T_FROMTIMESTAMP;
4647
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.Int;
4748
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObject;
49+
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectBorrowed;
4850
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyObjectTransfer;
4951
import static com.oracle.graal.python.builtins.objects.cext.capi.transitions.ArgDescriptor.PyTypeObject;
5052

@@ -57,8 +59,11 @@
5759
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiBuiltin;
5860
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiQuaternaryBuiltinNode;
5961
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiTernaryBuiltinNode;
62+
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode;
6063
import com.oracle.graal.python.builtins.objects.cext.capi.PyDateTimeCAPIWrapper;
64+
import com.oracle.graal.python.builtins.objects.cext.capi.PyDateTimeMRNode;
6165
import com.oracle.graal.python.builtins.objects.function.PKeyword;
66+
import com.oracle.graal.python.lib.PyObjectGetAttr;
6267
import com.oracle.graal.python.lib.PyObjectLookupAttr;
6368
import com.oracle.graal.python.nodes.argument.keywords.ExpandKeywordStarargsNode;
6469
import com.oracle.graal.python.nodes.argument.positional.ExecutePositionalStarargsNode;
@@ -162,4 +167,13 @@ static Object values(int hour, int minute, int second, int usecond, Object tzinf
162167
return call.execute(null, type, new Object[]{hour, minute, second, usecond, tzinfo}, new PKeyword[]{new PKeyword(T_FOLD, fold)});
163168
}
164169
}
170+
171+
@CApiBuiltin(ret = PyObjectBorrowed, args = {PyObject}, call = Direct)
172+
abstract static class PyTruffle_PyDateTime_GET_TZINFO extends CApiUnaryBuiltinNode {
173+
@Specialization
174+
static Object get(Object obj,
175+
@Cached PyObjectGetAttr getAttr) {
176+
return getAttr.execute(null, obj, PyDateTimeMRNode.T_TZINFO);
177+
}
178+
}
165179
}

0 commit comments

Comments
 (0)