From 5ee3779a6bcaafa4a6eca004c1040cc612739ca4 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Thu, 15 Jun 2023 15:13:30 +0800 Subject: [PATCH] ... --- src/pocketpy.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/pocketpy.h b/src/pocketpy.h index c0b6c79b..cb5d6bf4 100644 --- a/src/pocketpy.h +++ b/src/pocketpy.h @@ -100,6 +100,19 @@ inline void init_builtins(VM* _vm) { return VAR(MappingProxy(mod)); }); + _vm->bind_builtin_func<3>("pow", [](VM* vm, ArgsView args) { + i64 lhs = CAST(i64, args[0]); // assume lhs>=0 + i64 rhs = CAST(i64, args[1]); // assume rhs>=0 + i64 mod = CAST(i64, args[2]); // assume mod>0 + i64 res = 1; + while(rhs){ + if(rhs & 1) res = res*lhs % mod; + lhs = lhs*lhs % mod; + rhs >>= 1; + } + return VAR(res); + }); + _vm->bind_builtin_func<1>("id", [](VM* vm, ArgsView args) { PyObject* obj = args[0]; if(is_tagged(obj)) return vm->None; @@ -301,6 +314,14 @@ inline void init_builtins(VM* _vm) { return vm->None; }); + _vm->bind_method<0>("int", "bit_length", [](VM* vm, ArgsView args) { + i64 x = _CAST(i64, args[0]); + if(x < 0) x = -x; + int bits = 0; + while(x){ x >>= 1; bits++; } + return VAR(bits); + }); + _vm->bind__floordiv__(_vm->tp_int, [](VM* vm, PyObject* lhs_, PyObject* rhs_) { i64 rhs = CAST(i64, rhs_); return VAR(_CAST(i64, lhs_) / rhs);