|
25 | 25 | */
|
26 | 26 | package com.oracle.graal.python.builtins.modules;
|
27 | 27 |
|
| 28 | +import java.text.DateFormatSymbols; |
28 | 29 | import java.time.Instant;
|
29 | 30 | import java.time.LocalDateTime;
|
30 | 31 | import java.time.ZoneId;
|
| 32 | +import java.time.ZoneOffset; |
31 | 33 | import java.time.ZonedDateTime;
|
| 34 | +import java.util.Arrays; |
| 35 | +import java.util.Calendar; |
| 36 | +import java.util.GregorianCalendar; |
32 | 37 | import java.util.List;
|
33 | 38 |
|
34 | 39 | import com.oracle.graal.python.builtins.Builtin;
|
|
38 | 43 | import com.oracle.graal.python.builtins.objects.PNone;
|
39 | 44 | import com.oracle.graal.python.builtins.objects.ints.PInt;
|
40 | 45 | import com.oracle.graal.python.builtins.objects.tuple.PTuple;
|
| 46 | +import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; |
41 | 47 | import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
|
| 48 | +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; |
42 | 49 | import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
|
| 50 | +import com.oracle.graal.python.nodes.util.CastToIndexNode; |
43 | 51 | import com.oracle.graal.python.nodes.util.CastToIntegerFromIntNode;
|
44 | 52 | import com.oracle.truffle.api.CompilerDirectives;
|
45 | 53 | import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
|
46 | 54 | import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
|
47 | 55 | import com.oracle.truffle.api.TruffleOptions;
|
48 | 56 | import com.oracle.truffle.api.dsl.Fallback;
|
49 | 57 | import com.oracle.truffle.api.dsl.GenerateNodeFactory;
|
| 58 | +import com.oracle.truffle.api.dsl.NodeFactory; |
50 | 59 | import com.oracle.truffle.api.dsl.Specialization;
|
51 | 60 | import com.oracle.truffle.api.dsl.TypeSystemReference;
|
| 61 | +import com.oracle.truffle.api.nodes.ExplodeLoop; |
52 | 62 | import com.oracle.truffle.api.profiles.ConditionProfile;
|
53 |
| -import java.text.DateFormatSymbols; |
54 |
| -import java.util.Arrays; |
55 |
| -import java.util.Calendar; |
56 |
| -import java.util.GregorianCalendar; |
57 | 63 |
|
58 | 64 | @CoreFunctions(defineModule = "time")
|
59 | 65 | public final class TimeModuleBuiltins extends PythonBuiltins {
|
60 | 66 | private static final int DELAY_NANOS = 10;
|
61 | 67 |
|
62 | 68 | @Override
|
63 |
| - protected List<com.oracle.truffle.api.dsl.NodeFactory<? extends PythonBuiltinNode>> getNodeFactories() { |
| 69 | + protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() { |
64 | 70 | return TimeModuleBuiltinsFactory.getFactories();
|
65 | 71 | }
|
66 | 72 |
|
@@ -592,4 +598,35 @@ public String formatTime(Object format, @SuppressWarnings("unused") Object time)
|
592 | 598 | throw raise(PythonBuiltinClassType.TypeError, "strftime() argument 1 must be str, not %p", format);
|
593 | 599 | }
|
594 | 600 | }
|
| 601 | + |
| 602 | + @Builtin(name = "mktime", fixedNumOfPositionalArgs = 1, doc = "mktime(tuple) -> floating point number\n\n" + |
| 603 | + "Convert a time tuple in local time to seconds since the Epoch.\n" + |
| 604 | + "Note that mktime(gmtime(0)) will not generally return zero for most\n" + |
| 605 | + "time zones; instead the returned value will either be equal to that\n" + |
| 606 | + "of the timezone or altzone attributes on the time module.") |
| 607 | + @GenerateNodeFactory |
| 608 | + static abstract class MkTimeNode extends PythonUnaryBuiltinNode { |
| 609 | + private static final int ELEMENT_COUNT = 9; |
| 610 | + @Child CastToIndexNode castInt = CastToIndexNode.create(); |
| 611 | + |
| 612 | + @Specialization |
| 613 | + @ExplodeLoop |
| 614 | + double mktime(PTuple tuple) { |
| 615 | + Object[] items = tuple.getArray(); |
| 616 | + if (items.length != 9) { |
| 617 | + throw raise(PythonBuiltinClassType.TypeError, "function takes exactly 9 arguments (%d given)", items.length); |
| 618 | + } |
| 619 | + int[] integers = new int[9]; |
| 620 | + for (int i = 0; i < ELEMENT_COUNT; i++) { |
| 621 | + integers[i] = castInt.execute(items[i]); |
| 622 | + } |
| 623 | + return op(integers); |
| 624 | + } |
| 625 | + |
| 626 | + @TruffleBoundary |
| 627 | + private static long op(int[] integers) { |
| 628 | + LocalDateTime localtime = LocalDateTime.of(integers[0], integers[1], integers[2], integers[3], integers[4], integers[5]); |
| 629 | + return localtime.toEpochSecond(ZoneOffset.UTC); |
| 630 | + } |
| 631 | + } |
595 | 632 | }
|
0 commit comments