Skip to content

Commit b4584d0

Browse files
committed
Add public functions for accessing datetime members
1 parent 0d72d48 commit b4584d0

File tree

3 files changed

+239
-22
lines changed

3 files changed

+239
-22
lines changed

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

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -119,37 +119,57 @@ typedef struct
119119
} PyDateTime_DateTime; /* hastzinfo true */
120120

121121

122-
PyAPI_FUNC(PyObject*) GraalPyPrivate_PyDateTime_GET_TZINFO(PyObject*);
123-
PyAPI_FUNC(long) GraalPyPrivate_PyDateTime_GET_LONG_FIELD(PyObject* o, const char* field_name);
122+
// GraalPy public API
123+
PyAPI_FUNC(int) GraalPyDateTime_GET_YEAR(PyObject*);
124+
PyAPI_FUNC(int) GraalPyDateTime_GET_MONTH(PyObject*);
125+
PyAPI_FUNC(int) GraalPyDateTime_GET_DAY(PyObject*);
126+
127+
PyAPI_FUNC(int) GraalPyDateTime_DATE_GET_HOUR(PyObject*);
128+
PyAPI_FUNC(int) GraalPyDateTime_DATE_GET_MINUTE(PyObject*);
129+
PyAPI_FUNC(int) GraalPyDateTime_DATE_GET_SECOND(PyObject*);
130+
PyAPI_FUNC(int) GraalPyDateTime_DATE_GET_MICROSECOND(PyObject*);
131+
PyAPI_FUNC(int) GraalPyDateTime_DATE_GET_FOLD(PyObject*);
132+
PyAPI_FUNC(PyObject*) GraalPyDateTime_DATE_GET_TZINFO(PyObject*);
133+
134+
PyAPI_FUNC(int) GraalPyDateTime_TIME_GET_HOUR(PyObject*);
135+
PyAPI_FUNC(int) GraalPyDateTime_TIME_GET_MINUTE(PyObject*);
136+
PyAPI_FUNC(int) GraalPyDateTime_TIME_GET_SECOND(PyObject*);
137+
PyAPI_FUNC(int) GraalPyDateTime_TIME_GET_MICROSECOND(PyObject*);
138+
PyAPI_FUNC(int) GraalPyDateTime_TIME_GET_FOLD(PyObject*);
139+
PyAPI_FUNC(PyObject*) GraalPyDateTime_TIME_GET_TZINFO(PyObject*);
140+
141+
PyAPI_FUNC(int) GraalPyDateTime_DELTA_GET_DAYS(PyObject*);
142+
PyAPI_FUNC(int) GraalPyDateTime_DELTA_GET_SECONDS(PyObject*);
143+
PyAPI_FUNC(int) GraalPyDateTime_DELTA_GET_MICROSECONDS(PyObject*);
124144

125145
/* Apply for date and datetime instances. */
126146

127147
// o is a pointer to a time or a datetime object.
128-
#define _PyDateTime_HAS_TZINFO(o) (GraalPyPrivate_PyDateTime_GET_TZINFO((PyObject*)o) != Py_None)
148+
#define _PyDateTime_HAS_TZINFO(o) (GraalPyDateTime_DATE_GET_TZINFO((PyObject*)o) != Py_None)
129149

130-
#define PyDateTime_GET_YEAR(o) ((int)GraalPyPrivate_PyDateTime_GET_LONG_FIELD((PyObject*)o, "year"))
131-
#define PyDateTime_GET_MONTH(o) ((unsigned char)GraalPyPrivate_PyDateTime_GET_LONG_FIELD((PyObject*)o, "month"))
132-
#define PyDateTime_GET_DAY(o) ((unsigned char)GraalPyPrivate_PyDateTime_GET_LONG_FIELD((PyObject*)o, "day"))
150+
#define PyDateTime_GET_YEAR(o) (GraalPyDateTime_GET_YEAR((PyObject*)o))
151+
#define PyDateTime_GET_MONTH(o) ((unsigned char)GraalPyDateTime_GET_MONTH((PyObject*)o))
152+
#define PyDateTime_GET_DAY(o) ((unsigned char)GraalPyDateTime_GET_DAY((PyObject*)o))
133153

134-
#define PyDateTime_DATE_GET_HOUR(o) ((unsigned char)GraalPyPrivate_PyDateTime_GET_LONG_FIELD((PyObject*)o, "hour"))
135-
#define PyDateTime_DATE_GET_MINUTE(o) ((unsigned char)GraalPyPrivate_PyDateTime_GET_LONG_FIELD((PyObject*)o, "minute"))
136-
#define PyDateTime_DATE_GET_SECOND(o) ((unsigned char)GraalPyPrivate_PyDateTime_GET_LONG_FIELD((PyObject*)o, "second"))
137-
#define PyDateTime_DATE_GET_MICROSECOND(o) ((int)GraalPyPrivate_PyDateTime_GET_LONG_FIELD((PyObject*)o, "microsecond"))
138-
#define PyDateTime_DATE_GET_FOLD(o) ((unsigned char)GraalPyPrivate_PyDateTime_GET_LONG_FIELD((PyObject*)o, "fold"))
139-
#define PyDateTime_DATE_GET_TZINFO(o) (GraalPyPrivate_PyDateTime_GET_TZINFO((PyObject*)o))
154+
#define PyDateTime_DATE_GET_HOUR(o) ((unsigned char)GraalPyDateTime_DATE_GET_HOUR((PyObject*)o))
155+
#define PyDateTime_DATE_GET_MINUTE(o) ((unsigned char)GraalPyDateTime_DATE_GET_MINUTE((PyObject*)o))
156+
#define PyDateTime_DATE_GET_SECOND(o) ((unsigned char)GraalPyDateTime_DATE_GET_SECOND((PyObject*)o))
157+
#define PyDateTime_DATE_GET_MICROSECOND(o) (GraalPyDateTime_DATE_GET_MICROSECOND((PyObject*)o))
158+
#define PyDateTime_DATE_GET_FOLD(o) ((unsigned char)GraalPyDateTime_DATE_GET_FOLD((PyObject*)o))
159+
#define PyDateTime_DATE_GET_TZINFO(o) (GraalPyDateTime_DATE_GET_TZINFO((PyObject*)o))
140160

141161
/* Apply for time instances. */
142-
#define PyDateTime_TIME_GET_HOUR(o) ((unsigned char)GraalPyPrivate_PyDateTime_GET_LONG_FIELD((PyObject*)o, "hour"))
143-
#define PyDateTime_TIME_GET_MINUTE(o) ((unsigned char)GraalPyPrivate_PyDateTime_GET_LONG_FIELD((PyObject*)o, "minute"))
144-
#define PyDateTime_TIME_GET_SECOND(o) ((unsigned char)GraalPyPrivate_PyDateTime_GET_LONG_FIELD((PyObject*)o, "second"))
145-
#define PyDateTime_TIME_GET_MICROSECOND(o) ((int)GraalPyPrivate_PyDateTime_GET_LONG_FIELD((PyObject*)o, "microsecond"))
146-
#define PyDateTime_TIME_GET_FOLD(o) ((unsigned char)GraalPyPrivate_PyDateTime_GET_LONG_FIELD((PyObject*)o, "fold"))
147-
#define PyDateTime_TIME_GET_TZINFO(o) (GraalPyPrivate_PyDateTime_GET_TZINFO((PyObject*)o))
162+
#define PyDateTime_TIME_GET_HOUR(o) ((unsigned char)GraalPyDateTime_TIME_GET_HOUR((PyObject*)o))
163+
#define PyDateTime_TIME_GET_MINUTE(o) ((unsigned char)GraalPyDateTime_TIME_GET_MINUTE((PyObject*)o))
164+
#define PyDateTime_TIME_GET_SECOND(o) ((unsigned char)GraalPyDateTime_TIME_GET_SECOND((PyObject*)o))
165+
#define PyDateTime_TIME_GET_MICROSECOND(o) (GraalPyDateTime_TIME_GET_MICROSECOND((PyObject*)o))
166+
#define PyDateTime_TIME_GET_FOLD(o) ((unsigned char)GraalPyDateTime_TIME_GET_FOLD((PyObject*)o))
167+
#define PyDateTime_TIME_GET_TZINFO(o) (GraalPyDateTime_TIME_GET_TZINFO((PyObject*)o))
148168

149169
/* Apply for time delta instances */
150-
#define PyDateTime_DELTA_GET_DAYS(o) ((int)GraalPyPrivate_PyDateTime_GET_LONG_FIELD((PyObject*)o, "days"))
151-
#define PyDateTime_DELTA_GET_SECONDS(o) ((int)GraalPyPrivate_PyDateTime_GET_LONG_FIELD((PyObject*)o, "seconds"))
152-
#define PyDateTime_DELTA_GET_MICROSECONDS(o) ((int)GraalPyPrivate_PyDateTime_GET_LONG_FIELD((PyObject*)o, "microseconds"))
170+
#define PyDateTime_DELTA_GET_DAYS(o) (GraalPyDateTime_DELTA_GET_DAYS((PyObject*)o))
171+
#define PyDateTime_DELTA_GET_SECONDS(o) (GraalPyDateTime_DELTA_GET_SECONDS((PyObject*)o))
172+
#define PyDateTime_DELTA_GET_MICROSECONDS(o) (GraalPyDateTime_DELTA_GET_MICROSECONDS((PyObject*)o))
153173

154174

155175

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

Lines changed: 188 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import com.oracle.graal.python.builtins.modules.cext.PythonCextBuiltins.CApiUnaryBuiltinNode;
6363
import com.oracle.graal.python.builtins.objects.cext.capi.PyDateTimeCAPIWrapper;
6464
import com.oracle.graal.python.builtins.objects.function.PKeyword;
65+
import com.oracle.graal.python.lib.PyNumberAsSizeNode;
6566
import com.oracle.graal.python.lib.PyObjectGetAttr;
6667
import com.oracle.graal.python.lib.PyObjectLookupAttr;
6768
import com.oracle.graal.python.nodes.argument.keywords.ExpandKeywordStarargsNode;
@@ -171,13 +172,199 @@ static Object values(int hour, int minute, int second, int usecond, Object tzinf
171172
}
172173
}
173174

175+
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)
176+
abstract static class GraalPyDateTime_GET_YEAR extends CApiUnaryBuiltinNode {
177+
@Specialization
178+
static Object get(Object obj,
179+
@Bind Node inliningTarget,
180+
@Cached PyObjectGetAttr getAttr,
181+
@Cached PyNumberAsSizeNode asSizeNode) {
182+
return asSizeNode.executeExact(null, inliningTarget, getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_YEAR));
183+
}
184+
}
185+
186+
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)
187+
abstract static class GraalPyDateTime_GET_MONTH extends CApiUnaryBuiltinNode {
188+
@Specialization
189+
static Object get(Object obj,
190+
@Bind Node inliningTarget,
191+
@Cached PyObjectGetAttr getAttr,
192+
@Cached PyNumberAsSizeNode asSizeNode) {
193+
return asSizeNode.executeExact(null, inliningTarget, getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_MONTH));
194+
}
195+
}
196+
197+
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)
198+
abstract static class GraalPyDateTime_GET_DAY extends CApiUnaryBuiltinNode {
199+
@Specialization
200+
static Object get(Object obj,
201+
@Bind Node inliningTarget,
202+
@Cached PyObjectGetAttr getAttr,
203+
@Cached PyNumberAsSizeNode asSizeNode) {
204+
return asSizeNode.executeExact(null, inliningTarget, getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_DAY));
205+
}
206+
}
207+
208+
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)
209+
abstract static class GraalPyDateTime_DATE_GET_HOUR extends CApiUnaryBuiltinNode {
210+
@Specialization
211+
static Object get(Object obj,
212+
@Bind Node inliningTarget,
213+
@Cached PyObjectGetAttr getAttr,
214+
@Cached PyNumberAsSizeNode asSizeNode) {
215+
return asSizeNode.executeExact(null, inliningTarget, getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_HOUR));
216+
}
217+
}
218+
219+
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)
220+
abstract static class GraalPyDateTime_DATE_GET_MINUTE extends CApiUnaryBuiltinNode {
221+
@Specialization
222+
static Object get(Object obj,
223+
@Bind Node inliningTarget,
224+
@Cached PyObjectGetAttr getAttr,
225+
@Cached PyNumberAsSizeNode asSizeNode) {
226+
return asSizeNode.executeExact(null, inliningTarget, getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_MINUTE));
227+
}
228+
}
229+
230+
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)
231+
abstract static class GraalPyDateTime_DATE_GET_SECOND extends CApiUnaryBuiltinNode {
232+
@Specialization
233+
static Object get(Object obj,
234+
@Bind Node inliningTarget,
235+
@Cached PyObjectGetAttr getAttr,
236+
@Cached PyNumberAsSizeNode asSizeNode) {
237+
return asSizeNode.executeExact(null, inliningTarget, getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_SECOND));
238+
}
239+
}
240+
241+
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)
242+
abstract static class GraalPyDateTime_DATE_GET_MICROSECOND extends CApiUnaryBuiltinNode {
243+
@Specialization
244+
static Object get(Object obj,
245+
@Bind Node inliningTarget,
246+
@Cached PyObjectGetAttr getAttr,
247+
@Cached PyNumberAsSizeNode asSizeNode) {
248+
return asSizeNode.executeExact(null, inliningTarget, getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_MICROSECOND));
249+
}
250+
}
251+
252+
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)
253+
abstract static class GraalPyDateTime_DATE_GET_FOLD extends CApiUnaryBuiltinNode {
254+
@Specialization
255+
static Object get(Object obj,
256+
@Bind Node inliningTarget,
257+
@Cached PyObjectGetAttr getAttr,
258+
@Cached PyNumberAsSizeNode asSizeNode) {
259+
return asSizeNode.executeExact(null, inliningTarget, getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_FOLD));
260+
}
261+
}
262+
174263
@CApiBuiltin(ret = PyObjectBorrowed, args = {PyObject}, call = Direct)
175-
abstract static class GraalPyPrivate_PyDateTime_GET_TZINFO extends CApiUnaryBuiltinNode {
264+
abstract static class GraalPyDateTime_DATE_GET_TZINFO extends CApiUnaryBuiltinNode {
176265
@Specialization
177266
static Object get(Object obj,
178267
@Bind Node inliningTarget,
179268
@Cached PyObjectGetAttr getAttr) {
180269
return getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_TZINFO);
181270
}
182271
}
272+
273+
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)
274+
abstract static class GraalPyDateTime_TIME_GET_HOUR extends CApiUnaryBuiltinNode {
275+
@Specialization
276+
static Object get(Object obj,
277+
@Bind Node inliningTarget,
278+
@Cached PyObjectGetAttr getAttr,
279+
@Cached PyNumberAsSizeNode asSizeNode) {
280+
return asSizeNode.executeExact(null, inliningTarget, getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_HOUR));
281+
}
282+
}
283+
284+
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)
285+
abstract static class GraalPyDateTime_TIME_GET_MINUTE extends CApiUnaryBuiltinNode {
286+
@Specialization
287+
static Object get(Object obj,
288+
@Bind Node inliningTarget,
289+
@Cached PyObjectGetAttr getAttr,
290+
@Cached PyNumberAsSizeNode asSizeNode) {
291+
return asSizeNode.executeExact(null, inliningTarget, getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_MINUTE));
292+
}
293+
}
294+
295+
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)
296+
abstract static class GraalPyDateTime_TIME_GET_SECOND extends CApiUnaryBuiltinNode {
297+
@Specialization
298+
static Object get(Object obj,
299+
@Bind Node inliningTarget,
300+
@Cached PyObjectGetAttr getAttr,
301+
@Cached PyNumberAsSizeNode asSizeNode) {
302+
return asSizeNode.executeExact(null, inliningTarget, getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_SECOND));
303+
}
304+
}
305+
306+
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)
307+
abstract static class GraalPyDateTime_TIME_GET_MICROSECOND extends CApiUnaryBuiltinNode {
308+
@Specialization
309+
static Object get(Object obj,
310+
@Bind Node inliningTarget,
311+
@Cached PyObjectGetAttr getAttr,
312+
@Cached PyNumberAsSizeNode asSizeNode) {
313+
return asSizeNode.executeExact(null, inliningTarget, getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_MICROSECOND));
314+
}
315+
}
316+
317+
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)
318+
abstract static class GraalPyDateTime_TIME_GET_FOLD extends CApiUnaryBuiltinNode {
319+
@Specialization
320+
static Object get(Object obj,
321+
@Bind Node inliningTarget,
322+
@Cached PyObjectGetAttr getAttr,
323+
@Cached PyNumberAsSizeNode asSizeNode) {
324+
return asSizeNode.executeExact(null, inliningTarget, getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_FOLD));
325+
}
326+
}
327+
328+
@CApiBuiltin(ret = PyObjectBorrowed, args = {PyObject}, call = Direct)
329+
abstract static class GraalPyDateTime_TIME_GET_TZINFO extends CApiUnaryBuiltinNode {
330+
@Specialization
331+
static Object get(Object obj,
332+
@Bind Node inliningTarget,
333+
@Cached PyObjectGetAttr getAttr) {
334+
return getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_TZINFO);
335+
}
336+
}
337+
338+
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)
339+
abstract static class GraalPyDateTime_DELTA_GET_DAYS extends CApiUnaryBuiltinNode {
340+
@Specialization
341+
static Object get(Object obj,
342+
@Bind Node inliningTarget,
343+
@Cached PyObjectGetAttr getAttr,
344+
@Cached PyNumberAsSizeNode asSizeNode) {
345+
return asSizeNode.executeExact(null, inliningTarget, getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_DAYS));
346+
}
347+
}
348+
349+
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)
350+
abstract static class GraalPyDateTime_DELTA_GET_SECONDS extends CApiUnaryBuiltinNode {
351+
@Specialization
352+
static Object get(Object obj,
353+
@Bind Node inliningTarget,
354+
@Cached PyObjectGetAttr getAttr,
355+
@Cached PyNumberAsSizeNode asSizeNode) {
356+
return asSizeNode.executeExact(null, inliningTarget, getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_SECONDS));
357+
}
358+
}
359+
360+
@CApiBuiltin(ret = Int, args = {PyObject}, call = Direct)
361+
abstract static class GraalPyDateTime_DELTA_GET_MICROSECONDS extends CApiUnaryBuiltinNode {
362+
@Specialization
363+
static Object get(Object obj,
364+
@Bind Node inliningTarget,
365+
@Cached PyObjectGetAttr getAttr,
366+
@Cached PyNumberAsSizeNode asSizeNode) {
367+
return asSizeNode.executeExact(null, inliningTarget, getAttr.execute(inliningTarget, obj, PyDateTimeCAPIWrapper.T_MICROSECONDS));
368+
}
369+
}
183370
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/PyDateTimeCAPIWrapper.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,16 @@ public abstract class PyDateTimeCAPIWrapper {
100100

101101
private static final TruffleString T_TIMEDELTA = tsLiteral("timedelta");
102102
public static final TruffleString T_TZINFO = tsLiteral("tzinfo");
103+
public static final TruffleString T_DAY = tsLiteral("day");
104+
public static final TruffleString T_MONTH = tsLiteral("month");
105+
public static final TruffleString T_YEAR = tsLiteral("year");
106+
public static final TruffleString T_HOUR = tsLiteral("hour");
107+
public static final TruffleString T_MINUTE = tsLiteral("minute");
108+
public static final TruffleString T_SECOND = tsLiteral("second");
109+
public static final TruffleString T_MICROSECOND = tsLiteral("microsecond");
110+
public static final TruffleString T_DAYS = tsLiteral("days");
111+
public static final TruffleString T_SECONDS = tsLiteral("seconds");
112+
public static final TruffleString T_MICROSECONDS = tsLiteral("microseconds");
103113
private static final TruffleString T_TIMEZONE = tsLiteral("timezone");
104114
private static final TruffleString T_UTC = tsLiteral("utc");
105115
public static final TruffleString T_FROMTIMESTAMP = tsLiteral("fromtimestamp");

0 commit comments

Comments
 (0)