mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 03:20:18 +00:00
...
This commit is contained in:
parent
3eec499b95
commit
a6adcfd0c1
@ -7,4 +7,5 @@ void pk__add_module_math();
|
|||||||
void pk__add_module_dis();
|
void pk__add_module_dis();
|
||||||
void pk__add_module_random();
|
void pk__add_module_random();
|
||||||
void pk__add_module_json();
|
void pk__add_module_json();
|
||||||
void pk__add_module_gc();
|
void pk__add_module_gc();
|
||||||
|
void pk__add_module_time();
|
||||||
|
@ -360,6 +360,8 @@ void py_push(py_Ref src);
|
|||||||
void py_pushnil();
|
void py_pushnil();
|
||||||
/// Push a `None` object to the stack.
|
/// Push a `None` object to the stack.
|
||||||
void py_pushnone();
|
void py_pushnone();
|
||||||
|
/// Push a `py_Name` to the stack. This is used for keyword arguments.
|
||||||
|
void py_pushname(py_Name name);
|
||||||
/// Pop an object from the stack.
|
/// Pop an object from the stack.
|
||||||
void py_pop();
|
void py_pop();
|
||||||
/// Shrink the stack by n.
|
/// Shrink the stack by n.
|
||||||
|
@ -202,6 +202,7 @@ void VM__ctor(VM* self) {
|
|||||||
pk__add_module_random();
|
pk__add_module_random();
|
||||||
pk__add_module_json();
|
pk__add_module_json();
|
||||||
pk__add_module_gc();
|
pk__add_module_gc();
|
||||||
|
pk__add_module_time();
|
||||||
|
|
||||||
// add python builtins
|
// add python builtins
|
||||||
do {
|
do {
|
||||||
|
60
src/modules/time.c
Normal file
60
src/modules/time.c
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
#include "pocketpy/pocketpy.h"
|
||||||
|
#include "time.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define NANOS_PER_SEC 1000000000
|
||||||
|
|
||||||
|
static bool get_ns(int64_t* out) {
|
||||||
|
struct timespec tms;
|
||||||
|
/* The C11 way */
|
||||||
|
if(!timespec_get(&tms, TIME_UTC)) {
|
||||||
|
return py_exception(tp_OSError, "%s", "timespec_get() failed");
|
||||||
|
}
|
||||||
|
/* seconds, multiplied with 1 billion */
|
||||||
|
int64_t nanos = tms.tv_sec * NANOS_PER_SEC;
|
||||||
|
/* Add full nanoseconds */
|
||||||
|
nanos += tms.tv_nsec;
|
||||||
|
*out = nanos;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool time_time(int argc, py_Ref argv) {
|
||||||
|
PY_CHECK_ARGC(0);
|
||||||
|
int64_t nanos;
|
||||||
|
if(!get_ns(&nanos)) return false;
|
||||||
|
py_newfloat(py_retval(), (double)nanos / NANOS_PER_SEC);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool time_time_ns(int argc, py_Ref argv) {
|
||||||
|
PY_CHECK_ARGC(0);
|
||||||
|
int64_t nanos;
|
||||||
|
if(!get_ns(&nanos)) return false;
|
||||||
|
py_newint(py_retval(), nanos);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool time_sleep(int argc, py_Ref argv) {
|
||||||
|
PY_CHECK_ARGC(1);
|
||||||
|
py_f64 secs;
|
||||||
|
if(!py_castfloat(argv, &secs)) return false;
|
||||||
|
|
||||||
|
int64_t start;
|
||||||
|
if(!get_ns(&start)) return false;
|
||||||
|
const int64_t end = start + secs * 1000000000;
|
||||||
|
while(true) {
|
||||||
|
int64_t now;
|
||||||
|
if(!get_ns(&now)) return false;
|
||||||
|
if(now >= end) break;
|
||||||
|
}
|
||||||
|
py_newnone(py_retval());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pk__add_module_time() {
|
||||||
|
py_Ref mod = py_newmodule("time");
|
||||||
|
|
||||||
|
py_bindfunc(mod, "time", time_time);
|
||||||
|
py_bindfunc(mod, "time_ns", time_time_ns);
|
||||||
|
py_bindfunc(mod, "sleep", time_sleep);
|
||||||
|
}
|
@ -100,8 +100,12 @@ void py_pushnone() {
|
|||||||
py_newnone(vm->stack.sp++);
|
py_newnone(vm->stack.sp++);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void py_pushname(py_Name name){
|
||||||
|
VM* vm = pk_current_vm;
|
||||||
|
py_newint(vm->stack.sp++, name);
|
||||||
|
}
|
||||||
|
|
||||||
py_Ref py_pushtmp() {
|
py_Ref py_pushtmp() {
|
||||||
VM* vm = pk_current_vm;
|
VM* vm = pk_current_vm;
|
||||||
py_newnil(vm->stack.sp++);
|
return vm->stack.sp++;
|
||||||
return py_peek(-1);
|
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user