mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
some cleanup
This commit is contained in:
parent
664fc07dcd
commit
139093df3a
@ -48,6 +48,7 @@ void init_builtins(VM* _vm) {
|
|||||||
#undef BIND_NUM_ARITH_OPT
|
#undef BIND_NUM_ARITH_OPT
|
||||||
#undef BIND_NUM_LOGICAL_OPT
|
#undef BIND_NUM_LOGICAL_OPT
|
||||||
|
|
||||||
|
// builtin functions
|
||||||
_vm->bind_func<-1>(_vm->builtins, "super", [](VM* vm, ArgsView args) {
|
_vm->bind_func<-1>(_vm->builtins, "super", [](VM* vm, ArgsView args) {
|
||||||
PyObject* class_arg = nullptr;
|
PyObject* class_arg = nullptr;
|
||||||
PyObject* self_arg = nullptr;
|
PyObject* self_arg = nullptr;
|
||||||
@ -195,14 +196,14 @@ void init_builtins(VM* _vm) {
|
|||||||
return vm->None;
|
return vm->None;
|
||||||
});
|
});
|
||||||
|
|
||||||
_vm->bind_func<-1>(_vm->builtins, "exit", [](VM* vm, ArgsView args) {
|
_vm->bind(_vm->builtins, "exit(code=0)", [](VM* vm, ArgsView args) {
|
||||||
if(args.size() == 0) std::exit(0);
|
std::exit(CAST(int, args[0]));
|
||||||
else if(args.size() == 1) std::exit(CAST(int, args[0]));
|
|
||||||
else vm->TypeError("exit() takes at most 1 argument");
|
|
||||||
return vm->None;
|
return vm->None;
|
||||||
});
|
});
|
||||||
|
|
||||||
_vm->bind_func<1>(_vm->builtins, "repr", PK_LAMBDA(vm->py_repr(args[0])));
|
_vm->bind_func<1>(_vm->builtins, "repr", [](VM* vm, ArgsView args){
|
||||||
|
return vm->py_repr(args[0]);
|
||||||
|
});
|
||||||
|
|
||||||
_vm->bind_func<1>(_vm->builtins, "len", [](VM* vm, ArgsView args){
|
_vm->bind_func<1>(_vm->builtins, "len", [](VM* vm, ArgsView args){
|
||||||
const PyTypeInfo* ti = vm->_inst_type_info(args[0]);
|
const PyTypeInfo* ti = vm->_inst_type_info(args[0]);
|
||||||
@ -217,7 +218,7 @@ void init_builtins(VM* _vm) {
|
|||||||
|
|
||||||
_vm->bind_func<1>(_vm->builtins, "chr", [](VM* vm, ArgsView args) {
|
_vm->bind_func<1>(_vm->builtins, "chr", [](VM* vm, ArgsView args) {
|
||||||
i64 i = CAST(i64, args[0]);
|
i64 i = CAST(i64, args[0]);
|
||||||
if (i < 0 || i > 128) vm->ValueError("chr() arg not in range(128)");
|
if (i < 0 || i >= 128) vm->ValueError("chr() arg not in [0, 128)");
|
||||||
return VAR(std::string(1, (char)i));
|
return VAR(std::string(1, (char)i));
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -296,6 +297,7 @@ void init_builtins(VM* _vm) {
|
|||||||
return VAR(std::move(ret));
|
return VAR(std::move(ret));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// tp_object
|
||||||
_vm->bind__repr__(VM::tp_object, [](VM* vm, PyObject* obj) {
|
_vm->bind__repr__(VM::tp_object, [](VM* vm, PyObject* obj) {
|
||||||
if(is_tagged(obj)) PK_FATAL_ERROR();
|
if(is_tagged(obj)) PK_FATAL_ERROR();
|
||||||
std::stringstream ss; // hex
|
std::stringstream ss; // hex
|
||||||
@ -304,7 +306,9 @@ void init_builtins(VM* _vm) {
|
|||||||
return VAR(ss.str());
|
return VAR(ss.str());
|
||||||
});
|
});
|
||||||
|
|
||||||
_vm->bind__eq__(VM::tp_object, [](VM* vm, PyObject* lhs, PyObject* rhs) { return VAR(lhs == rhs); });
|
_vm->bind__eq__(VM::tp_object, [](VM* vm, PyObject* lhs, PyObject* rhs) {
|
||||||
|
return VAR(lhs == rhs);
|
||||||
|
});
|
||||||
|
|
||||||
_vm->cached_object__new__ = _vm->bind_constructor<1>(_vm->_t(VM::tp_object), [](VM* vm, ArgsView args) {
|
_vm->cached_object__new__ = _vm->bind_constructor<1>(_vm->_t(VM::tp_object), [](VM* vm, ArgsView args) {
|
||||||
vm->check_non_tagged_type(args[0], vm->tp_type);
|
vm->check_non_tagged_type(args[0], vm->tp_type);
|
||||||
@ -324,8 +328,10 @@ void init_builtins(VM* _vm) {
|
|||||||
return vm->None;
|
return vm->None;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// tp_type
|
||||||
_vm->bind_constructor<2>(_vm->_t(VM::tp_type), PK_LAMBDA(vm->_t(args[1])));
|
_vm->bind_constructor<2>(_vm->_t(VM::tp_type), PK_LAMBDA(vm->_t(args[1])));
|
||||||
|
|
||||||
|
// tp_range
|
||||||
_vm->bind_constructor<-1>(_vm->_t(VM::tp_range), [](VM* vm, ArgsView args) {
|
_vm->bind_constructor<-1>(_vm->_t(VM::tp_range), [](VM* vm, ArgsView args) {
|
||||||
args._begin += 1; // skip cls
|
args._begin += 1; // skip cls
|
||||||
Range r;
|
Range r;
|
||||||
@ -339,13 +345,17 @@ void init_builtins(VM* _vm) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
_vm->bind__iter__(VM::tp_range, [](VM* vm, PyObject* obj) { return VAR_T(RangeIter, PK_OBJ_GET(Range, obj)); });
|
_vm->bind__iter__(VM::tp_range, [](VM* vm, PyObject* obj) { return VAR_T(RangeIter, PK_OBJ_GET(Range, obj)); });
|
||||||
_vm->bind__repr__(_vm->_type("NoneType"), [](VM* vm, PyObject* obj) { return VAR("None"); });
|
|
||||||
|
|
||||||
|
// tp_nonetype
|
||||||
|
_vm->bind__repr__(_vm->_type("NoneType"), [](VM* vm, PyObject* obj) {
|
||||||
|
return VAR("None");
|
||||||
|
});
|
||||||
|
|
||||||
|
// tp_float / tp_float
|
||||||
_vm->bind__truediv__(VM::tp_float, [](VM* vm, PyObject* lhs, PyObject* rhs) {
|
_vm->bind__truediv__(VM::tp_float, [](VM* vm, PyObject* lhs, PyObject* rhs) {
|
||||||
f64 value = CAST_F(rhs);
|
f64 value = CAST_F(rhs);
|
||||||
return VAR(_CAST(f64, lhs) / value);
|
return VAR(_CAST(f64, lhs) / value);
|
||||||
});
|
});
|
||||||
|
|
||||||
_vm->bind__truediv__(VM::tp_int, [](VM* vm, PyObject* lhs, PyObject* rhs) {
|
_vm->bind__truediv__(VM::tp_int, [](VM* vm, PyObject* lhs, PyObject* rhs) {
|
||||||
f64 value = CAST_F(rhs);
|
f64 value = CAST_F(rhs);
|
||||||
return VAR(_CAST(i64, lhs) / value);
|
return VAR(_CAST(i64, lhs) / value);
|
||||||
@ -373,7 +383,6 @@ void init_builtins(VM* _vm) {
|
|||||||
_vm->bind__pow__(VM::tp_int, py_number_pow);
|
_vm->bind__pow__(VM::tp_int, py_number_pow);
|
||||||
_vm->bind__pow__(VM::tp_float, py_number_pow);
|
_vm->bind__pow__(VM::tp_float, py_number_pow);
|
||||||
|
|
||||||
/************ int ************/
|
|
||||||
_vm->bind_constructor<-1>(_vm->_t(VM::tp_int), [](VM* vm, ArgsView args) {
|
_vm->bind_constructor<-1>(_vm->_t(VM::tp_int), [](VM* vm, ArgsView args) {
|
||||||
if(args.size() == 1+0) return VAR(0);
|
if(args.size() == 1+0) return VAR(0);
|
||||||
// 1 arg
|
// 1 arg
|
||||||
@ -398,14 +407,6 @@ void init_builtins(VM* _vm) {
|
|||||||
return vm->None;
|
return vm->None;
|
||||||
});
|
});
|
||||||
|
|
||||||
_vm->bind_method<0>(VM::tp_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_) {
|
_vm->bind__floordiv__(VM::tp_int, [](VM* vm, PyObject* lhs_, PyObject* rhs_) {
|
||||||
i64 rhs = CAST(i64, rhs_);
|
i64 rhs = CAST(i64, rhs_);
|
||||||
if(rhs == 0) vm->ZeroDivisionError();
|
if(rhs == 0) vm->ZeroDivisionError();
|
||||||
@ -419,11 +420,8 @@ void init_builtins(VM* _vm) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
_vm->bind__repr__(VM::tp_int, [](VM* vm, PyObject* obj) { return VAR(std::to_string(_CAST(i64, obj))); });
|
_vm->bind__repr__(VM::tp_int, [](VM* vm, PyObject* obj) { return VAR(std::to_string(_CAST(i64, obj))); });
|
||||||
|
|
||||||
_vm->bind__neg__(VM::tp_int, [](VM* vm, PyObject* obj) { return VAR(-_CAST(i64, obj)); });
|
_vm->bind__neg__(VM::tp_int, [](VM* vm, PyObject* obj) { return VAR(-_CAST(i64, obj)); });
|
||||||
|
|
||||||
_vm->bind__hash__(VM::tp_int, [](VM* vm, PyObject* obj) { return _CAST(i64, obj); });
|
_vm->bind__hash__(VM::tp_int, [](VM* vm, PyObject* obj) { return _CAST(i64, obj); });
|
||||||
|
|
||||||
_vm->bind__invert__(VM::tp_int, [](VM* vm, PyObject* obj) { return VAR(~_CAST(i64, obj)); });
|
_vm->bind__invert__(VM::tp_int, [](VM* vm, PyObject* obj) { return VAR(~_CAST(i64, obj)); });
|
||||||
|
|
||||||
#define INT_BITWISE_OP(name, op) \
|
#define INT_BITWISE_OP(name, op) \
|
||||||
@ -439,7 +437,6 @@ void init_builtins(VM* _vm) {
|
|||||||
|
|
||||||
#undef INT_BITWISE_OP
|
#undef INT_BITWISE_OP
|
||||||
|
|
||||||
/************ float ************/
|
|
||||||
_vm->bind_constructor<-1>(_vm->_t(VM::tp_float), [](VM* vm, ArgsView args) {
|
_vm->bind_constructor<-1>(_vm->_t(VM::tp_float), [](VM* vm, ArgsView args) {
|
||||||
if(args.size() == 1+0) return VAR(0.0);
|
if(args.size() == 1+0) return VAR(0.0);
|
||||||
if(args.size() > 1+1) vm->TypeError("float() takes at most 1 argument");
|
if(args.size() > 1+1) vm->TypeError("float() takes at most 1 argument");
|
||||||
@ -480,7 +477,7 @@ void init_builtins(VM* _vm) {
|
|||||||
return VAR(ss.str());
|
return VAR(ss.str());
|
||||||
});
|
});
|
||||||
|
|
||||||
/************ str ************/
|
// tp_str
|
||||||
_vm->bind_constructor<2>(_vm->_t(VM::tp_str), PK_LAMBDA(vm->py_str(args[1])));
|
_vm->bind_constructor<2>(_vm->_t(VM::tp_str), PK_LAMBDA(vm->py_str(args[1])));
|
||||||
|
|
||||||
_vm->bind__hash__(VM::tp_str, [](VM* vm, PyObject* obj) {
|
_vm->bind__hash__(VM::tp_str, [](VM* vm, PyObject* obj) {
|
||||||
@ -500,7 +497,6 @@ void init_builtins(VM* _vm) {
|
|||||||
for(i64 i = 0; i < n; i++) ss << self.sv();
|
for(i64 i = 0; i < n; i++) ss << self.sv();
|
||||||
return VAR(ss.str());
|
return VAR(ss.str());
|
||||||
});
|
});
|
||||||
|
|
||||||
_vm->bind_method<1>(VM::tp_str, "__rmul__", [](VM* vm, ArgsView args) {
|
_vm->bind_method<1>(VM::tp_str, "__rmul__", [](VM* vm, ArgsView args) {
|
||||||
const Str& self = _CAST(Str&, args[0]);
|
const Str& self = _CAST(Str&, args[0]);
|
||||||
i64 n = CAST(i64, args[1]);
|
i64 n = CAST(i64, args[1]);
|
||||||
@ -508,7 +504,6 @@ void init_builtins(VM* _vm) {
|
|||||||
for(i64 i = 0; i < n; i++) ss << self.sv();
|
for(i64 i = 0; i < n; i++) ss << self.sv();
|
||||||
return VAR(ss.str());
|
return VAR(ss.str());
|
||||||
});
|
});
|
||||||
|
|
||||||
_vm->bind__contains__(VM::tp_str, [](VM* vm, PyObject* lhs, PyObject* rhs) {
|
_vm->bind__contains__(VM::tp_str, [](VM* vm, PyObject* lhs, PyObject* rhs) {
|
||||||
const Str& self = _CAST(Str&, lhs);
|
const Str& self = _CAST(Str&, lhs);
|
||||||
return VAR(self.index(CAST(Str&, rhs)) != -1);
|
return VAR(self.index(CAST(Str&, rhs)) != -1);
|
||||||
@ -645,7 +640,7 @@ void init_builtins(VM* _vm) {
|
|||||||
return VAR(self.upper());
|
return VAR(self.upper());
|
||||||
});
|
});
|
||||||
|
|
||||||
/************ list ************/
|
// tp_list / tp_tuple
|
||||||
_vm->bind(_vm->_t(VM::tp_list), "sort(self, key=None, reverse=False)", [](VM* vm, ArgsView args) {
|
_vm->bind(_vm->_t(VM::tp_list), "sort(self, key=None, reverse=False)", [](VM* vm, ArgsView args) {
|
||||||
List& self = _CAST(List&, args[0]);
|
List& self = _CAST(List&, args[0]);
|
||||||
PyObject* key = args[1];
|
PyObject* key = args[1];
|
||||||
@ -694,9 +689,7 @@ void init_builtins(VM* _vm) {
|
|||||||
|
|
||||||
_vm->bind_constructor<-1>(_vm->_t(VM::tp_list), [](VM* vm, ArgsView args) {
|
_vm->bind_constructor<-1>(_vm->_t(VM::tp_list), [](VM* vm, ArgsView args) {
|
||||||
if(args.size() == 1+0) return VAR(List());
|
if(args.size() == 1+0) return VAR(List());
|
||||||
if(args.size() == 1+1){
|
if(args.size() == 1+1) return vm->py_list(args[1]);
|
||||||
return vm->py_list(args[1]);
|
|
||||||
}
|
|
||||||
vm->TypeError("list() takes 0 or 1 arguments");
|
vm->TypeError("list() takes 0 or 1 arguments");
|
||||||
return vm->None;
|
return vm->None;
|
||||||
});
|
});
|
||||||
@ -878,7 +871,6 @@ void init_builtins(VM* _vm) {
|
|||||||
self.erase(i);
|
self.erase(i);
|
||||||
});
|
});
|
||||||
|
|
||||||
/************ tuple ************/
|
|
||||||
_vm->bind_constructor<-1>(_vm->_t(VM::tp_tuple), [](VM* vm, ArgsView args) {
|
_vm->bind_constructor<-1>(_vm->_t(VM::tp_tuple), [](VM* vm, ArgsView args) {
|
||||||
if(args.size() == 1+0) return VAR(Tuple(0));
|
if(args.size() == 1+0) return VAR(Tuple(0));
|
||||||
if(args.size() == 1+1){
|
if(args.size() == 1+1){
|
||||||
@ -933,7 +925,7 @@ void init_builtins(VM* _vm) {
|
|||||||
return (i64)_CAST(Tuple&, obj).size();
|
return (i64)_CAST(Tuple&, obj).size();
|
||||||
});
|
});
|
||||||
|
|
||||||
/************ bool ************/
|
// tp_bool
|
||||||
_vm->bind_constructor<2>(_vm->_t(VM::tp_bool), PK_LAMBDA(VAR(vm->py_bool(args[1]))));
|
_vm->bind_constructor<2>(_vm->_t(VM::tp_bool), PK_LAMBDA(VAR(vm->py_bool(args[1]))));
|
||||||
_vm->bind__hash__(VM::tp_bool, [](VM* vm, PyObject* obj) {
|
_vm->bind__hash__(VM::tp_bool, [](VM* vm, PyObject* obj) {
|
||||||
return (i64)_CAST(bool, obj);
|
return (i64)_CAST(bool, obj);
|
||||||
@ -957,6 +949,8 @@ void init_builtins(VM* _vm) {
|
|||||||
if(is_int(rhs)) return VAR(_CAST(bool, lhs) == (bool)CAST(i64, rhs));
|
if(is_int(rhs)) return VAR(_CAST(bool, lhs) == (bool)CAST(i64, rhs));
|
||||||
return vm->NotImplemented;
|
return vm->NotImplemented;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// tp_ellipsis / tp_NotImplementedType
|
||||||
_vm->bind__repr__(_vm->_type("ellipsis"), [](VM* vm, PyObject* self) {
|
_vm->bind__repr__(_vm->_type("ellipsis"), [](VM* vm, PyObject* self) {
|
||||||
return VAR("...");
|
return VAR("...");
|
||||||
});
|
});
|
||||||
@ -964,7 +958,7 @@ void init_builtins(VM* _vm) {
|
|||||||
return VAR("NotImplemented");
|
return VAR("NotImplemented");
|
||||||
});
|
});
|
||||||
|
|
||||||
/************ bytes ************/
|
// tp_bytes
|
||||||
_vm->bind_constructor<2>(_vm->_t(VM::tp_bytes), [](VM* vm, ArgsView args){
|
_vm->bind_constructor<2>(_vm->_t(VM::tp_bytes), [](VM* vm, ArgsView args){
|
||||||
List& list = CAST(List&, args[1]);
|
List& list = CAST(List&, args[1]);
|
||||||
std::vector<unsigned char> buffer(list.size());
|
std::vector<unsigned char> buffer(list.size());
|
||||||
@ -1015,7 +1009,8 @@ void init_builtins(VM* _vm) {
|
|||||||
if(!is_non_tagged_type(rhs, vm->tp_bytes)) return vm->NotImplemented;
|
if(!is_non_tagged_type(rhs, vm->tp_bytes)) return vm->NotImplemented;
|
||||||
return VAR(_CAST(Bytes&, lhs) == _CAST(Bytes&, rhs));
|
return VAR(_CAST(Bytes&, lhs) == _CAST(Bytes&, rhs));
|
||||||
});
|
});
|
||||||
/************ slice ************/
|
|
||||||
|
// tp_slice
|
||||||
_vm->bind_constructor<4>(_vm->_t(VM::tp_slice), [](VM* vm, ArgsView args) {
|
_vm->bind_constructor<4>(_vm->_t(VM::tp_slice), [](VM* vm, ArgsView args) {
|
||||||
return VAR(Slice(args[1], args[2], args[3]));
|
return VAR(Slice(args[1], args[2], args[3]));
|
||||||
});
|
});
|
||||||
@ -1030,7 +1025,7 @@ void init_builtins(VM* _vm) {
|
|||||||
return VAR(ss.str());
|
return VAR(ss.str());
|
||||||
});
|
});
|
||||||
|
|
||||||
/************ mappingproxy ************/
|
// tp_mappingproxy
|
||||||
_vm->bind_method<0>(VM::tp_mappingproxy, "keys", [](VM* vm, ArgsView args) {
|
_vm->bind_method<0>(VM::tp_mappingproxy, "keys", [](VM* vm, ArgsView args) {
|
||||||
MappingProxy& self = _CAST(MappingProxy&, args[0]);
|
MappingProxy& self = _CAST(MappingProxy&, args[0]);
|
||||||
List keys;
|
List keys;
|
||||||
@ -1060,11 +1055,9 @@ void init_builtins(VM* _vm) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
_vm->bind__eq__(VM::tp_mappingproxy, [](VM* vm, PyObject* obj, PyObject* other){
|
_vm->bind__eq__(VM::tp_mappingproxy, [](VM* vm, PyObject* obj, PyObject* other){
|
||||||
MappingProxy& a = _CAST(MappingProxy&, obj);
|
const MappingProxy& a = _CAST(MappingProxy&, obj);
|
||||||
if(!is_non_tagged_type(other, vm->tp_mappingproxy)){
|
if(!is_non_tagged_type(other, vm->tp_mappingproxy)) return vm->NotImplemented;
|
||||||
return vm->NotImplemented;
|
const MappingProxy& b = _CAST(MappingProxy&, other);
|
||||||
}
|
|
||||||
MappingProxy& b = _CAST(MappingProxy&, other);
|
|
||||||
return VAR(a.obj == b.obj);
|
return VAR(a.obj == b.obj);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -1103,7 +1096,7 @@ void init_builtins(VM* _vm) {
|
|||||||
return VAR(self.attr().contains(CAST(Str&, key)));
|
return VAR(self.attr().contains(CAST(Str&, key)));
|
||||||
});
|
});
|
||||||
|
|
||||||
/************ dict ************/
|
// tp_dict
|
||||||
_vm->bind_constructor<-1>(_vm->_t(VM::tp_dict), [](VM* vm, ArgsView args){
|
_vm->bind_constructor<-1>(_vm->_t(VM::tp_dict), [](VM* vm, ArgsView args){
|
||||||
return VAR(Dict(vm));
|
return VAR(Dict(vm));
|
||||||
});
|
});
|
||||||
@ -1268,7 +1261,7 @@ void init_builtins(VM* _vm) {
|
|||||||
return VAR(fmt("<module ", path.escape(), ">"));
|
return VAR(fmt("<module ", path.escape(), ">"));
|
||||||
});
|
});
|
||||||
|
|
||||||
/************ property ************/
|
// tp_property
|
||||||
_vm->bind_constructor<-1>(_vm->_t(VM::tp_property), [](VM* vm, ArgsView args) {
|
_vm->bind_constructor<-1>(_vm->_t(VM::tp_property), [](VM* vm, ArgsView args) {
|
||||||
if(args.size() == 1+1){
|
if(args.size() == 1+1){
|
||||||
return VAR(Property(args[1], vm->None, ""));
|
return VAR(Property(args[1], vm->None, ""));
|
||||||
@ -1281,6 +1274,7 @@ void init_builtins(VM* _vm) {
|
|||||||
return vm->None;
|
return vm->None;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// properties
|
||||||
_vm->bind_property(_vm->_t(VM::tp_property), "__signature__", [](VM* vm, ArgsView args){
|
_vm->bind_property(_vm->_t(VM::tp_property), "__signature__", [](VM* vm, ArgsView args){
|
||||||
Property& self = _CAST(Property&, args[0]);
|
Property& self = _CAST(Property&, args[0]);
|
||||||
return VAR(self.signature);
|
return VAR(self.signature);
|
||||||
@ -1308,7 +1302,7 @@ void init_builtins(VM* _vm) {
|
|||||||
return VAR("");
|
return VAR("");
|
||||||
});
|
});
|
||||||
|
|
||||||
// Exception
|
// tp_exception
|
||||||
_vm->bind_constructor<-1>(_vm->_t(VM::tp_exception), [](VM* vm, ArgsView args){
|
_vm->bind_constructor<-1>(_vm->_t(VM::tp_exception), [](VM* vm, ArgsView args){
|
||||||
Type cls = PK_OBJ_GET(Type, args[0]);
|
Type cls = PK_OBJ_GET(Type, args[0]);
|
||||||
StrName cls_name = obj_type_name(vm, cls);
|
StrName cls_name = obj_type_name(vm, cls);
|
||||||
|
@ -198,17 +198,6 @@ try:
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# 未完全测试准确性-----------------------------------------------
|
|
||||||
# 116: 392: _vm->bind_method<0>("int", "bit_length", [](VM* vm, ArgsView args) {
|
|
||||||
# #####: 393: i64 x = _CAST(i64, args[0]);
|
|
||||||
# #####: 394: if(x < 0) x = -x;
|
|
||||||
# -: 395: int bits = 0;
|
|
||||||
# #####: 396: while(x){ x >>= 1; bits++; }
|
|
||||||
# #####: 397: return VAR(bits);
|
|
||||||
# -: 398: });
|
|
||||||
# test int.bit_length:
|
|
||||||
assert type(int.bit_length(100)) is int
|
|
||||||
|
|
||||||
assert type(10//11) is int
|
assert type(10//11) is int
|
||||||
|
|
||||||
assert type(11%2) is int
|
assert type(11%2) is int
|
||||||
|
Loading…
x
Reference in New Issue
Block a user