remove bind_builtin_func

This commit is contained in:
blueloveTH 2024-01-14 20:02:31 +08:00
parent 310b11ec70
commit bfa073f8e1
3 changed files with 26 additions and 78 deletions

View File

@ -353,11 +353,6 @@ public:
}); });
} }
template<int ARGC>
PyObject* bind_builtin_func(Str name, NativeFuncC fn) {
return bind_func<ARGC>(builtins, name, fn);
}
int normalized_index(int index, int size); int normalized_index(int index, int size);
PyObject* py_next(PyObject* obj); PyObject* py_next(PyObject* obj);

View File

@ -48,7 +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
_vm->bind_builtin_func<-1>("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;
if(args.size() == 2){ if(args.size() == 2){
@ -76,19 +76,19 @@ void init_builtins(VM* _vm) {
return vm->heap.gcnew<Super>(vm->tp_super, self_arg, vm->_all_types[type].base); return vm->heap.gcnew<Super>(vm->tp_super, self_arg, vm->_all_types[type].base);
}); });
_vm->bind_builtin_func<1>("staticmethod", [](VM* vm, ArgsView args) { _vm->bind_func<1>(_vm->builtins, "staticmethod", [](VM* vm, ArgsView args) {
PyObject* func = args[0]; PyObject* func = args[0];
vm->check_non_tagged_type(func, vm->tp_function); vm->check_non_tagged_type(func, vm->tp_function);
return vm->heap.gcnew<StaticMethod>(vm->tp_staticmethod, args[0]); return vm->heap.gcnew<StaticMethod>(vm->tp_staticmethod, args[0]);
}); });
_vm->bind_builtin_func<1>("classmethod", [](VM* vm, ArgsView args) { _vm->bind_func<1>(_vm->builtins, "classmethod", [](VM* vm, ArgsView args) {
PyObject* func = args[0]; PyObject* func = args[0];
vm->check_non_tagged_type(func, vm->tp_function); vm->check_non_tagged_type(func, vm->tp_function);
return vm->heap.gcnew<ClassMethod>(vm->tp_classmethod, args[0]); return vm->heap.gcnew<ClassMethod>(vm->tp_classmethod, args[0]);
}); });
_vm->bind_builtin_func<2>("isinstance", [](VM* vm, ArgsView args) { _vm->bind_func<2>(_vm->builtins, "isinstance", [](VM* vm, ArgsView args) {
if(is_non_tagged_type(args[1], vm->tp_tuple)){ if(is_non_tagged_type(args[1], vm->tp_tuple)){
Tuple& types = _CAST(Tuple&, args[1]); Tuple& types = _CAST(Tuple&, args[1]);
for(PyObject* type : types){ for(PyObject* type : types){
@ -102,13 +102,13 @@ void init_builtins(VM* _vm) {
return VAR(vm->isinstance(args[0], type)); return VAR(vm->isinstance(args[0], type));
}); });
_vm->bind_builtin_func<2>("issubclass", [](VM* vm, ArgsView args) { _vm->bind_func<2>(_vm->builtins, "issubclass", [](VM* vm, ArgsView args) {
vm->check_non_tagged_type(args[0], vm->tp_type); vm->check_non_tagged_type(args[0], vm->tp_type);
vm->check_non_tagged_type(args[1], vm->tp_type); vm->check_non_tagged_type(args[1], vm->tp_type);
return VAR(vm->issubclass(PK_OBJ_GET(Type, args[0]), PK_OBJ_GET(Type, args[1]))); return VAR(vm->issubclass(PK_OBJ_GET(Type, args[0]), PK_OBJ_GET(Type, args[1])));
}); });
_vm->bind_builtin_func<0>("globals", [](VM* vm, ArgsView args) { _vm->bind_func<0>(_vm->builtins, "globals", [](VM* vm, ArgsView args) {
PyObject* mod = vm->top_frame()->_module; PyObject* mod = vm->top_frame()->_module;
return VAR(MappingProxy(mod)); return VAR(MappingProxy(mod));
}); });
@ -127,20 +127,20 @@ void init_builtins(VM* _vm) {
} }
}); });
_vm->bind_builtin_func<1>("abs", [](VM* vm, ArgsView args) { _vm->bind_func<1>(_vm->builtins, "abs", [](VM* vm, ArgsView args) {
if(is_int(args[0])) return VAR(std::abs(_CAST(i64, args[0]))); if(is_int(args[0])) return VAR(std::abs(_CAST(i64, args[0])));
if(is_float(args[0])) return VAR(std::abs(_CAST(f64, args[0]))); if(is_float(args[0])) return VAR(std::abs(_CAST(f64, args[0])));
vm->TypeError("bad operand type for abs()"); vm->TypeError("bad operand type for abs()");
return vm->None; return vm->None;
}); });
_vm->bind_builtin_func<1>("id", [](VM* vm, ArgsView args) { _vm->bind_func<1>(_vm->builtins, "id", [](VM* vm, ArgsView args) {
PyObject* obj = args[0]; PyObject* obj = args[0];
if(is_tagged(obj)) return vm->None; if(is_tagged(obj)) return vm->None;
return VAR(PK_BITS(obj)); return VAR(PK_BITS(obj));
}); });
_vm->bind_builtin_func<1>("callable", [](VM* vm, ArgsView args) { _vm->bind_func<1>(_vm->builtins, "callable", [](VM* vm, ArgsView args) {
PyObject* cls = vm->_t(args[0]); PyObject* cls = vm->_t(args[0]);
switch(PK_OBJ_GET(Type, cls).index){ switch(PK_OBJ_GET(Type, cls).index){
case VM::tp_function.index: return vm->True; case VM::tp_function.index: return vm->True;
@ -152,12 +152,12 @@ void init_builtins(VM* _vm) {
return VAR(ok); return VAR(ok);
}); });
_vm->bind_builtin_func<1>("__import__", [](VM* vm, ArgsView args) { _vm->bind_func<1>(_vm->builtins, "__import__", [](VM* vm, ArgsView args) {
const Str& name = CAST(Str&, args[0]); const Str& name = CAST(Str&, args[0]);
return vm->py_import(name); return vm->py_import(name);
}); });
_vm->bind_builtin_func<2>("divmod", [](VM* vm, ArgsView args) { _vm->bind_func<2>(_vm->builtins, "divmod", [](VM* vm, ArgsView args) {
if(is_int(args[0])){ if(is_int(args[0])){
i64 lhs = _CAST(i64, args[0]); i64 lhs = _CAST(i64, args[0]);
i64 rhs = CAST(i64, args[1]); i64 rhs = CAST(i64, args[1]);
@ -195,48 +195,48 @@ void init_builtins(VM* _vm) {
return vm->None; return vm->None;
}); });
_vm->bind_builtin_func<-1>("exit", [](VM* vm, ArgsView args) { _vm->bind_func<-1>(_vm->builtins, "exit", [](VM* vm, ArgsView args) {
if(args.size() == 0) std::exit(0); if(args.size() == 0) std::exit(0);
else if(args.size() == 1) 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"); else vm->TypeError("exit() takes at most 1 argument");
return vm->None; return vm->None;
}); });
_vm->bind_builtin_func<1>("repr", PK_LAMBDA(vm->py_repr(args[0]))); _vm->bind_func<1>(_vm->builtins, "repr", PK_LAMBDA(vm->py_repr(args[0])));
_vm->bind_builtin_func<1>("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]);
if(ti->m__len__) return VAR(ti->m__len__(vm, args[0])); if(ti->m__len__) return VAR(ti->m__len__(vm, args[0]));
return vm->call_method(args[0], __len__); return vm->call_method(args[0], __len__);
}); });
_vm->bind_builtin_func<1>("hash", [](VM* vm, ArgsView args){ _vm->bind_func<1>(_vm->builtins, "hash", [](VM* vm, ArgsView args){
i64 value = vm->py_hash(args[0]); i64 value = vm->py_hash(args[0]);
return VAR(value); return VAR(value);
}); });
_vm->bind_builtin_func<1>("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 range(128)");
return VAR(std::string(1, (char)i)); return VAR(std::string(1, (char)i));
}); });
_vm->bind_builtin_func<1>("ord", [](VM* vm, ArgsView args) { _vm->bind_func<1>(_vm->builtins, "ord", [](VM* vm, ArgsView args) {
const Str& s = CAST(Str&, args[0]); const Str& s = CAST(Str&, args[0]);
if (s.length()!=1) vm->TypeError("ord() expected an ASCII character"); if (s.length()!=1) vm->TypeError("ord() expected an ASCII character");
return VAR((i64)(s[0])); return VAR((i64)(s[0]));
}); });
_vm->bind_builtin_func<2>("hasattr", [](VM* vm, ArgsView args) { _vm->bind_func<2>(_vm->builtins, "hasattr", [](VM* vm, ArgsView args) {
return VAR(vm->getattr(args[0], CAST(Str&, args[1]), false) != nullptr); return VAR(vm->getattr(args[0], CAST(Str&, args[1]), false) != nullptr);
}); });
_vm->bind_builtin_func<3>("setattr", [](VM* vm, ArgsView args) { _vm->bind_func<3>(_vm->builtins, "setattr", [](VM* vm, ArgsView args) {
vm->setattr(args[0], CAST(Str&, args[1]), args[2]); vm->setattr(args[0], CAST(Str&, args[1]), args[2]);
return vm->None; return vm->None;
}); });
_vm->bind_builtin_func<-1>("getattr", [](VM* vm, ArgsView args) { _vm->bind_func<-1>(_vm->builtins, "getattr", [](VM* vm, ArgsView args) {
if(args.size()!=2 && args.size()!=3) vm->TypeError("getattr() takes 2 or 3 arguments"); if(args.size()!=2 && args.size()!=3) vm->TypeError("getattr() takes 2 or 3 arguments");
StrName name = CAST(Str&, args[1]); StrName name = CAST(Str&, args[1]);
PyObject* val = vm->getattr(args[0], name, false); PyObject* val = vm->getattr(args[0], name, false);
@ -247,26 +247,26 @@ void init_builtins(VM* _vm) {
return val; return val;
}); });
_vm->bind_builtin_func<2>("delattr", [](VM* vm, ArgsView args) { _vm->bind_func<2>(_vm->builtins, "delattr", [](VM* vm, ArgsView args) {
vm->delattr(args[0], CAST(Str&, args[1])); vm->delattr(args[0], CAST(Str&, args[1]));
return vm->None; return vm->None;
}); });
_vm->bind_builtin_func<1>("hex", [](VM* vm, ArgsView args) { _vm->bind_func<1>(_vm->builtins, "hex", [](VM* vm, ArgsView args) {
std::stringstream ss; // hex std::stringstream ss; // hex
ss << std::hex << CAST(i64, args[0]); ss << std::hex << CAST(i64, args[0]);
return VAR("0x" + ss.str()); return VAR("0x" + ss.str());
}); });
_vm->bind_builtin_func<1>("iter", [](VM* vm, ArgsView args) { _vm->bind_func<1>(_vm->builtins, "iter", [](VM* vm, ArgsView args) {
return vm->py_iter(args[0]); return vm->py_iter(args[0]);
}); });
_vm->bind_builtin_func<1>("next", [](VM* vm, ArgsView args) { _vm->bind_func<1>(_vm->builtins, "next", [](VM* vm, ArgsView args) {
return vm->py_next(args[0]); return vm->py_next(args[0]);
}); });
_vm->bind_builtin_func<1>("bin", [](VM* vm, ArgsView args) { _vm->bind_func<1>(_vm->builtins, "bin", [](VM* vm, ArgsView args) {
SStream ss; SStream ss;
i64 x = CAST(i64, args[0]); i64 x = CAST(i64, args[0]);
if(x < 0){ ss << "-"; x = -x; } if(x < 0){ ss << "-"; x = -x; }
@ -282,7 +282,7 @@ void init_builtins(VM* _vm) {
return VAR(ss.str()); return VAR(ss.str());
}); });
_vm->bind_builtin_func<1>("dir", [](VM* vm, ArgsView args) { _vm->bind_func<1>(_vm->builtins, "dir", [](VM* vm, ArgsView args) {
std::set<StrName> names; std::set<StrName> names;
if(!is_tagged(args[0]) && args[0]->is_attr_valid()){ if(!is_tagged(args[0]) && args[0]->is_attr_valid()){
std::vector<StrName> keys = args[0]->attr().keys(); std::vector<StrName> keys = args[0]->attr().keys();

View File

@ -95,29 +95,6 @@ try:
except: except:
pass pass
# 无法测试 -----------------------------------------------
# 248: 192: _vm->bind_builtin_func<1>("__import__", [](VM* vm, ArgsView args) {
# 67: 193: const Str& name = CAST(Str&, args[0]);
# 67: 194: auto dot = name.sv().find_last_of(".");
# 67: 195: if(dot != std::string_view::npos){
# #####: 196: auto ext = name.sv().substr(dot);
# #####: 197: if(ext == ".so" || ext == ".dll" || ext == ".dylib"){
# #####: 198: dylib_entry_t entry = load_dylib(name.c_str());
# #####: 199: if(!entry){
# #####: 200: vm->_error("ImportError", "cannot load dynamic library: " + name.escape());
# #####: 201: }
# #####: 202: vm->_c.s_view.push(ArgsView(vm->s_data.end(), vm->s_data.end()));
# #####: 203: const char* name = entry(vm, PK_VERSION);
# #####: 204: vm->_c.s_view.pop();
# #####: 205: if(name == nullptr){
# #####: 206: vm->_error("ImportError", "module initialization failed: " + Str(name).escape());
# #####: 207: }
# #####: 208: return vm->_modules[name];
# #####: 209: }
# #####: 210: }
# 67: 211: return vm->py_import(name);
# 67: 212: });
# test hash: # test hash:
# 测试整数类型的输入 # 测试整数类型的输入
assert hash(0) == 0 assert hash(0) == 0
@ -168,38 +145,14 @@ try:
except: except:
pass pass
# -----------------------------------------------
# 114: 259: _vm->bind_builtin_func<1>("chr", [](VM* vm, ArgsView args) {
# #####: 260: i64 i = CAST(i64, args[0]);
# #####: 261: if (i < 0 || i > 128) vm->ValueError("chr() arg not in range(128)");
# #####: 262: return VAR(std::string(1, (char)i));
# #####: 263: });
# test chr # test chr
l = [] l = []
for i in range(128): for i in range(128):
l.append(f'{i} {chr(i)}') l.append(f'{i} {chr(i)}')
assert l == ['0 \x00', '1 \x01', '2 \x02', '3 \x03', '4 \x04', '5 \x05', '6 \x06', '7 \x07', '8 \x08', '9 \t', '10 \n', '11 \x0b', '12 \x0c', '13 \r', '14 \x0e', '15 \x0f', '16 \x10', '17 \x11', '18 \x12', '19 \x13', '20 \x14', '21 \x15', '22 \x16', '23 \x17', '24 \x18', '25 \x19', '26 \x1a', '27 \x1b', '28 \x1c', '29 \x1d', '30 \x1e', '31 \x1f', '32 ', '33 !', '34 "', '35 #', '36 $', '37 %', '38 &', "39 '", '40 (', '41 )', '42 *', '43 +', '44 ,', '45 -', '46 .', '47 /', '48 0', '49 1', '50 2', '51 3', '52 4', '53 5', '54 6', '55 7', '56 8', '57 9', '58 :', '59 ;', '60 <', '61 =', '62 >', '63 ?', '64 @', '65 A', '66 B', '67 C', '68 D', '69 E', '70 F', '71 G', '72 H', '73 I', '74 J', '75 K', '76 L', '77 M', '78 N', '79 O', '80 P', '81 Q', '82 R', '83 S', '84 T', '85 U', '86 V', '87 W', '88 X', '89 Y', '90 Z', '91 [', '92 \\', '93 ]', '94 ^', '95 _', '96 `', '97 a', '98 b', '99 c', '100 d', '101 e', '102 f', '103 g', '104 h', '105 i', '106 j', '107 k', '108 l', '109 m', '110 n', '111 o', '112 p', '113 q', '114 r', '115 s', '116 t', '117 u', '118 v', '119 w', '120 x', '121 y', '122 z', '123 {', '124 |', '125 }', '126 ~', '127 \x7f'] assert l == ['0 \x00', '1 \x01', '2 \x02', '3 \x03', '4 \x04', '5 \x05', '6 \x06', '7 \x07', '8 \x08', '9 \t', '10 \n', '11 \x0b', '12 \x0c', '13 \r', '14 \x0e', '15 \x0f', '16 \x10', '17 \x11', '18 \x12', '19 \x13', '20 \x14', '21 \x15', '22 \x16', '23 \x17', '24 \x18', '25 \x19', '26 \x1a', '27 \x1b', '28 \x1c', '29 \x1d', '30 \x1e', '31 \x1f', '32 ', '33 !', '34 "', '35 #', '36 $', '37 %', '38 &', "39 '", '40 (', '41 )', '42 *', '43 +', '44 ,', '45 -', '46 .', '47 /', '48 0', '49 1', '50 2', '51 3', '52 4', '53 5', '54 6', '55 7', '56 8', '57 9', '58 :', '59 ;', '60 <', '61 =', '62 >', '63 ?', '64 @', '65 A', '66 B', '67 C', '68 D', '69 E', '70 F', '71 G', '72 H', '73 I', '74 J', '75 K', '76 L', '77 M', '78 N', '79 O', '80 P', '81 Q', '82 R', '83 S', '84 T', '85 U', '86 V', '87 W', '88 X', '89 Y', '90 Z', '91 [', '92 \\', '93 ]', '94 ^', '95 _', '96 `', '97 a', '98 b', '99 c', '100 d', '101 e', '102 f', '103 g', '104 h', '105 i', '106 j', '107 k', '108 l', '109 m', '110 n', '111 o', '112 p', '113 q', '114 r', '115 s', '116 t', '117 u', '118 v', '119 w', '120 x', '121 y', '122 z', '123 {', '124 |', '125 }', '126 ~', '127 \x7f']
assert type(bin(1234)) is str assert type(bin(1234)) is str
# 无法测试, 不能覆盖-----------------------------------------------
# 136: 285: _vm->bind_builtin_func<1>("dir", [](VM* vm, ArgsView args) {
# 10: 286: std::set<StrName> names;
# 10: 287: if(!is_tagged(args[0]) && args[0]->is_attr_valid()){
# #####: 288: std::vector<StrName> keys = args[0]->attr().keys();
# #####: 289: names.insert(keys.begin(), keys.end());
# #####: 290: }
# 10: 291: const NameDict& t_attr = vm->_t(args[0])->attr();
# 10: 292: std::vector<StrName> keys = t_attr.keys();
# 10: 293: names.insert(keys.begin(), keys.end());
# 10: 294: List ret;
# 305: 295: for (StrName name : names) ret.push_back(VAR(name.sv()));
# 10: 296: return VAR(std::move(ret));
# 10: 297: });
# test dir:
# test __repr__: # test __repr__:
class A(): class A():
def __init__(self): def __init__(self):