Skip to content

Commit 5817818

Browse files
committed
add time.mktime
1 parent c1059e8 commit 5817818

File tree

1 file changed

+42
-5
lines changed

1 file changed

+42
-5
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/TimeModuleBuiltins.java

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,15 @@
2525
*/
2626
package com.oracle.graal.python.builtins.modules;
2727

28+
import java.text.DateFormatSymbols;
2829
import java.time.Instant;
2930
import java.time.LocalDateTime;
3031
import java.time.ZoneId;
32+
import java.time.ZoneOffset;
3133
import java.time.ZonedDateTime;
34+
import java.util.Arrays;
35+
import java.util.Calendar;
36+
import java.util.GregorianCalendar;
3237
import java.util.List;
3338

3439
import com.oracle.graal.python.builtins.Builtin;
@@ -38,29 +43,30 @@
3843
import com.oracle.graal.python.builtins.objects.PNone;
3944
import com.oracle.graal.python.builtins.objects.ints.PInt;
4045
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
46+
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4147
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
48+
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
4249
import com.oracle.graal.python.nodes.truffle.PythonArithmeticTypes;
50+
import com.oracle.graal.python.nodes.util.CastToIndexNode;
4351
import com.oracle.graal.python.nodes.util.CastToIntegerFromIntNode;
4452
import com.oracle.truffle.api.CompilerDirectives;
4553
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
4654
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
4755
import com.oracle.truffle.api.TruffleOptions;
4856
import com.oracle.truffle.api.dsl.Fallback;
4957
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
58+
import com.oracle.truffle.api.dsl.NodeFactory;
5059
import com.oracle.truffle.api.dsl.Specialization;
5160
import com.oracle.truffle.api.dsl.TypeSystemReference;
61+
import com.oracle.truffle.api.nodes.ExplodeLoop;
5262
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;
5763

5864
@CoreFunctions(defineModule = "time")
5965
public final class TimeModuleBuiltins extends PythonBuiltins {
6066
private static final int DELAY_NANOS = 10;
6167

6268
@Override
63-
protected List<com.oracle.truffle.api.dsl.NodeFactory<? extends PythonBuiltinNode>> getNodeFactories() {
69+
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
6470
return TimeModuleBuiltinsFactory.getFactories();
6571
}
6672

@@ -592,4 +598,35 @@ public String formatTime(Object format, @SuppressWarnings("unused") Object time)
592598
throw raise(PythonBuiltinClassType.TypeError, "strftime() argument 1 must be str, not %p", format);
593599
}
594600
}
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+
}
595632
}

0 commit comments

Comments
 (0)