This commit is contained in:
blueloveTH 2024-01-17 15:29:35 +08:00
parent 3c5c536a05
commit 6455d40900
3 changed files with 176 additions and 161 deletions

View File

@ -306,8 +306,8 @@ 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) { _vm->bind__eq__(VM::tp_object, [](VM* vm, PyObject* _0, PyObject* _1) {
return VAR(lhs == rhs); return VAR(_0 == _1);
}); });
_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) {
@ -347,23 +347,23 @@ 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)); });
// tp_nonetype // tp_nonetype
_vm->bind__repr__(_vm->_tp(_vm->None), [](VM* vm, PyObject* obj) { _vm->bind__repr__(_vm->_tp(_vm->None), [](VM* vm, PyObject* _0) {
return VAR("None"); return VAR("None");
}); });
// tp_float / tp_float // 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* _0, PyObject* _1) {
f64 value = CAST_F(rhs); f64 value = CAST_F(_1);
return VAR(_CAST(f64, lhs) / value); return VAR(_CAST(f64, _0) / value);
}); });
_vm->bind__truediv__(VM::tp_int, [](VM* vm, PyObject* lhs, PyObject* rhs) { _vm->bind__truediv__(VM::tp_int, [](VM* vm, PyObject* _0, PyObject* _1) {
f64 value = CAST_F(rhs); f64 value = CAST_F(_1);
return VAR(_CAST(i64, lhs) / value); return VAR(_CAST(i64, _0) / value);
}); });
auto py_number_pow = [](VM* vm, PyObject* lhs_, PyObject* rhs_) { auto py_number_pow = [](VM* vm, PyObject* _0, PyObject* _1) {
i64 lhs, rhs; i64 lhs, rhs;
if(try_cast_int(lhs_, &lhs) && try_cast_int(rhs_, &rhs)){ if(try_cast_int(_0, &lhs) && try_cast_int(_1, &rhs)){
if(rhs < 0) { if(rhs < 0) {
if(lhs == 0) vm->ZeroDivisionError("0.0 cannot be raised to a negative power"); if(lhs == 0) vm->ZeroDivisionError("0.0 cannot be raised to a negative power");
return VAR((f64)std::pow(lhs, rhs)); return VAR((f64)std::pow(lhs, rhs));
@ -376,7 +376,7 @@ void init_builtins(VM* _vm) {
} }
return VAR(ret); return VAR(ret);
}else{ }else{
return VAR((f64)std::pow(CAST_F(lhs_), CAST_F(rhs_))); return VAR((f64)std::pow(CAST_F(_0), CAST_F(_1)));
} }
}; };
@ -407,16 +407,16 @@ void init_builtins(VM* _vm) {
return vm->None; return vm->None;
}); });
_vm->bind__floordiv__(VM::tp_int, [](VM* vm, PyObject* lhs_, PyObject* rhs_) { _vm->bind__floordiv__(VM::tp_int, [](VM* vm, PyObject* _0, PyObject* _1) {
i64 rhs = CAST(i64, rhs_); i64 rhs = CAST(i64, _1);
if(rhs == 0) vm->ZeroDivisionError(); if(rhs == 0) vm->ZeroDivisionError();
return VAR(_CAST(i64, lhs_) / rhs); return VAR(_CAST(i64, _0) / rhs);
}); });
_vm->bind__mod__(VM::tp_int, [](VM* vm, PyObject* lhs_, PyObject* rhs_) { _vm->bind__mod__(VM::tp_int, [](VM* vm, PyObject* _0, PyObject* _1) {
i64 rhs = CAST(i64, rhs_); i64 rhs = CAST(i64, _1);
if(rhs == 0) vm->ZeroDivisionError(); if(rhs == 0) vm->ZeroDivisionError();
return VAR(_CAST(i64, lhs_) % rhs); return VAR(_CAST(i64, _0) % rhs);
}); });
_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))); });
@ -463,15 +463,15 @@ void init_builtins(VM* _vm) {
return vm->None; return vm->None;
}); });
_vm->bind__hash__(VM::tp_float, [](VM* vm, PyObject* obj) { _vm->bind__hash__(VM::tp_float, [](VM* vm, PyObject* _0) {
f64 val = _CAST(f64, obj); f64 val = _CAST(f64, _0);
return (i64)std::hash<f64>()(val); return (i64)std::hash<f64>()(val);
}); });
_vm->bind__neg__(VM::tp_float, [](VM* vm, PyObject* obj) { return VAR(-_CAST(f64, obj)); }); _vm->bind__neg__(VM::tp_float, [](VM* vm, PyObject* _0) { return VAR(-_CAST(f64, _0)); });
_vm->bind__repr__(VM::tp_float, [](VM* vm, PyObject* obj) { _vm->bind__repr__(VM::tp_float, [](VM* vm, PyObject* _0) {
f64 val = _CAST(f64, obj); f64 val = _CAST(f64, _0);
SStream ss; SStream ss;
ss << val; ss << val;
return VAR(ss.str()); return VAR(ss.str());
@ -480,19 +480,19 @@ void init_builtins(VM* _vm) {
// tp_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* _0) {
return (i64)_CAST(Str&, obj).hash(); return (i64)_CAST(Str&, _0).hash();
}); });
_vm->bind__add__(VM::tp_str, [](VM* vm, PyObject* lhs, PyObject* rhs) { _vm->bind__add__(VM::tp_str, [](VM* vm, PyObject* _0, PyObject* _1) {
return VAR(_CAST(Str&, lhs) + CAST(Str&, rhs)); return VAR(_CAST(Str&, _0) + CAST(Str&, _1));
}); });
_vm->bind__len__(VM::tp_str, [](VM* vm, PyObject* obj) { _vm->bind__len__(VM::tp_str, [](VM* vm, PyObject* _0) {
return (i64)_CAST(Str&, obj).u8_length(); return (i64)_CAST(Str&, _0).u8_length();
}); });
_vm->bind__mul__(VM::tp_str, [](VM* vm, PyObject* lhs, PyObject* rhs) { _vm->bind__mul__(VM::tp_str, [](VM* vm, PyObject* _0, PyObject* _1) {
const Str& self = _CAST(Str&, lhs); const Str& self = _CAST(Str&, _0);
i64 n = CAST(i64, rhs); i64 n = CAST(i64, _1);
SStream ss; SStream ss;
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());
@ -504,15 +504,15 @@ 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* _0, PyObject* _1) {
const Str& self = _CAST(Str&, lhs); const Str& self = _CAST(Str&, _0);
return VAR(self.index(CAST(Str&, rhs)) != -1); return VAR(self.index(CAST(Str&, _1)) != -1);
}); });
_vm->bind__str__(VM::tp_str, [](VM* vm, PyObject* obj) { return obj; }); _vm->bind__str__(VM::tp_str, [](VM* vm, PyObject* _0) { return _0; });
_vm->bind__iter__(VM::tp_str, [](VM* vm, PyObject* obj) { return VAR_T(StringIter, obj); }); _vm->bind__iter__(VM::tp_str, [](VM* vm, PyObject* _0) { return VAR_T(StringIter, _0); });
_vm->bind__repr__(VM::tp_str, [](VM* vm, PyObject* obj) { _vm->bind__repr__(VM::tp_str, [](VM* vm, PyObject* _0) {
const Str& self = _CAST(Str&, obj); const Str& self = _CAST(Str&, _0);
return VAR(self.escape(true)); return VAR(self.escape());
}); });
#define BIND_CMP_STR(name, op) \ #define BIND_CMP_STR(name, op) \
@ -528,15 +528,15 @@ void init_builtins(VM* _vm) {
BIND_CMP_STR(__ge__, >=) BIND_CMP_STR(__ge__, >=)
#undef BIND_CMP_STR #undef BIND_CMP_STR
_vm->bind__getitem__(VM::tp_str, [](VM* vm, PyObject* obj, PyObject* index) { _vm->bind__getitem__(VM::tp_str, [](VM* vm, PyObject* _0, PyObject* _1) {
const Str& self = _CAST(Str&, obj); const Str& self = _CAST(Str&, _0);
if(is_non_tagged_type(index, vm->tp_slice)){ if(is_non_tagged_type(_1, vm->tp_slice)){
const Slice& s = _CAST(Slice&, index); const Slice& s = _CAST(Slice&, _1);
int start, stop, step; int start, stop, step;
vm->parse_int_slice(s, self.u8_length(), start, stop, step); vm->parse_int_slice(s, self.u8_length(), start, stop, step);
return VAR(self.u8_slice(start, stop, step)); return VAR(self.u8_slice(start, stop, step));
} }
int i = CAST(int, index); int i = CAST(int, _1);
i = vm->normalized_index(i, self.u8_length()); i = vm->normalized_index(i, self.u8_length());
return VAR(self.u8_getitem(i)); return VAR(self.u8_getitem(i));
}); });
@ -663,7 +663,11 @@ void init_builtins(VM* _vm) {
SStream ss; SStream ss;
ss << '['; ss << '[';
for(int i=0; i<iterable.size(); i++){ for(int i=0; i<iterable.size(); i++){
ss << CAST(Str&, vm->py_repr(iterable[i])); if(iterable[i] == _0){
ss << "[...]";
}else{
ss << CAST(Str&, vm->py_repr(iterable[i]));
}
if(i != iterable.size()-1) ss << ", "; if(i != iterable.size()-1) ss << ", ";
} }
ss << ']'; ss << ']';
@ -694,9 +698,9 @@ void init_builtins(VM* _vm) {
return vm->None; return vm->None;
}); });
_vm->bind__contains__(VM::tp_list, [](VM* vm, PyObject* obj, PyObject* item) { _vm->bind__contains__(VM::tp_list, [](VM* vm, PyObject* _0, PyObject* _1) {
List& self = _CAST(List&, obj); List& self = _CAST(List&, _0);
for(PyObject* i: self) if(vm->py_eq(i, item)) return vm->True; for(PyObject* i: self) if(vm->py_eq(i, _1)) return vm->True;
return vm->False; return vm->False;
}); });
@ -707,10 +711,10 @@ void init_builtins(VM* _vm) {
return VAR(count); return VAR(count);
}); });
_vm->bind__eq__(VM::tp_list, [](VM* vm, PyObject* lhs, PyObject* rhs) { _vm->bind__eq__(VM::tp_list, [](VM* vm, PyObject* _0, PyObject* _1) {
List& a = _CAST(List&, lhs); List& a = _CAST(List&, _0);
if(!is_non_tagged_type(rhs, vm->tp_list)) return vm->NotImplemented; if(!is_non_tagged_type(_1, vm->tp_list)) return vm->NotImplemented;
List& b = _CAST(List&, rhs); List& b = _CAST(List&, _1);
if(a.size() != b.size()) return vm->False; if(a.size() != b.size()) return vm->False;
for(int i=0; i<a.size(); i++){ for(int i=0; i<a.size(); i++){
if(!vm->py_eq(a[i], b[i])) return vm->False; if(!vm->py_eq(a[i], b[i])) return vm->False;
@ -782,10 +786,10 @@ void init_builtins(VM* _vm) {
return vm->None; return vm->None;
}); });
_vm->bind__mul__(VM::tp_list, [](VM* vm, PyObject* lhs, PyObject* rhs) { _vm->bind__mul__(VM::tp_list, [](VM* vm, PyObject* _0, PyObject* _1) {
const List& self = _CAST(List&, lhs); const List& self = _CAST(List&, _0);
if(!is_int(rhs)) return vm->NotImplemented; if(!is_int(_1)) return vm->NotImplemented;
int n = _CAST(int, rhs); int n = _CAST(int, _1);
List result; List result;
result.reserve(self.size() * n); result.reserve(self.size() * n);
for(int i = 0; i < n; i++) result.extend(self); for(int i = 0; i < n; i++) result.extend(self);
@ -842,31 +846,31 @@ void init_builtins(VM* _vm) {
#undef BIND_RICH_CMP #undef BIND_RICH_CMP
_vm->bind__add__(VM::tp_list, [](VM* vm, PyObject* lhs, PyObject* rhs) { _vm->bind__add__(VM::tp_list, [](VM* vm, PyObject* _0, PyObject* _1) {
const List& self = _CAST(List&, lhs); const List& self = _CAST(List&, _0);
const List& other = CAST(List&, rhs); const List& other = CAST(List&, _1);
List new_list(self); // copy construct List new_list(self); // copy construct
new_list.extend(other); new_list.extend(other);
return VAR(std::move(new_list)); return VAR(std::move(new_list));
}); });
_vm->bind__len__(VM::tp_list, [](VM* vm, PyObject* obj) { _vm->bind__len__(VM::tp_list, [](VM* vm, PyObject* _0) {
return (i64)_CAST(List&, obj).size(); return (i64)_CAST(List&, _0).size();
}); });
_vm->bind__iter__(VM::tp_list, [](VM* vm, PyObject* obj) { _vm->bind__iter__(VM::tp_list, [](VM* vm, PyObject* _0) {
List& self = _CAST(List&, obj); List& self = _CAST(List&, _0);
return VAR_T(ArrayIter, obj, self.begin(), self.end()); return VAR_T(ArrayIter, _0, self.begin(), self.end());
}); });
_vm->bind__getitem__(VM::tp_list, PyArrayGetItem<List>); _vm->bind__getitem__(VM::tp_list, PyArrayGetItem<List>);
_vm->bind__setitem__(VM::tp_list, [](VM* vm, PyObject* obj, PyObject* index, PyObject* value){ _vm->bind__setitem__(VM::tp_list, [](VM* vm, PyObject* _0, PyObject* _1, PyObject* _2){
List& self = _CAST(List&, obj); List& self = _CAST(List&, _0);
int i = CAST(int, index); int i = CAST(int, _1);
i = vm->normalized_index(i, self.size()); i = vm->normalized_index(i, self.size());
self[i] = value; self[i] = _2;
}); });
_vm->bind__delitem__(VM::tp_list, [](VM* vm, PyObject* obj, PyObject* index){ _vm->bind__delitem__(VM::tp_list, [](VM* vm, PyObject* _0, PyObject* _1){
List& self = _CAST(List&, obj); List& self = _CAST(List&, _0);
int i = CAST(int, index); int i = CAST(int, _1);
i = vm->normalized_index(i, self.size()); i = vm->normalized_index(i, self.size());
self.erase(i); self.erase(i);
}); });
@ -894,10 +898,10 @@ void init_builtins(VM* _vm) {
return VAR(count); return VAR(count);
}); });
_vm->bind__eq__(VM::tp_tuple, [](VM* vm, PyObject* lhs, PyObject* rhs) { _vm->bind__eq__(VM::tp_tuple, [](VM* vm, PyObject* _0, PyObject* _1) {
const Tuple& self = _CAST(Tuple&, lhs); const Tuple& self = _CAST(Tuple&, _0);
if(!is_non_tagged_type(rhs, vm->tp_tuple)) return vm->NotImplemented; if(!is_non_tagged_type(_1, vm->tp_tuple)) return vm->NotImplemented;
const Tuple& other = _CAST(Tuple&, rhs); const Tuple& other = _CAST(Tuple&, _1);
if(self.size() != other.size()) return vm->False; if(self.size() != other.size()) return vm->False;
for(int i = 0; i < self.size(); i++) { for(int i = 0; i < self.size(); i++) {
if(!vm->py_eq(self[i], other[i])) return vm->False; if(!vm->py_eq(self[i], other[i])) return vm->False;
@ -905,20 +909,19 @@ void init_builtins(VM* _vm) {
return vm->True; return vm->True;
}); });
_vm->bind__hash__(VM::tp_tuple, [](VM* vm, PyObject* obj) { _vm->bind__hash__(VM::tp_tuple, [](VM* vm, PyObject* _0) {
i64 x = 1000003; i64 x = 1000003;
const Tuple& items = CAST(Tuple&, obj); for (PyObject* item: _CAST(Tuple&, _0)) {
for (int i=0; i<items.size(); i++) { i64 y = vm->py_hash(item);
i64 y = vm->py_hash(items[i]);
// recommended by Github Copilot // recommended by Github Copilot
x = x ^ (y + 0x9e3779b9 + (x << 6) + (x >> 2)); x = x ^ (y + 0x9e3779b9 + (x << 6) + (x >> 2));
} }
return x; return x;
}); });
_vm->bind__iter__(VM::tp_tuple, [](VM* vm, PyObject* obj) { _vm->bind__iter__(VM::tp_tuple, [](VM* vm, PyObject* _0) {
Tuple& self = _CAST(Tuple&, obj); Tuple& self = _CAST(Tuple&, _0);
return VAR_T(ArrayIter, obj, self.begin(), self.end()); return VAR_T(ArrayIter, _0, self.begin(), self.end());
}); });
_vm->bind__getitem__(VM::tp_tuple, PyArrayGetItem<Tuple>); _vm->bind__getitem__(VM::tp_tuple, PyArrayGetItem<Tuple>);
_vm->bind__len__(VM::tp_tuple, [](VM* vm, PyObject* obj) { _vm->bind__len__(VM::tp_tuple, [](VM* vm, PyObject* obj) {
@ -927,34 +930,34 @@ void init_builtins(VM* _vm) {
// tp_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* _0) {
return (i64)_CAST(bool, obj); return (i64)_CAST(bool, _0);
}); });
_vm->bind__repr__(VM::tp_bool, [](VM* vm, PyObject* self) { _vm->bind__repr__(VM::tp_bool, [](VM* vm, PyObject* _0) {
bool val = _CAST(bool, self); bool val = _CAST(bool, _0);
return VAR(val ? "True" : "False"); return VAR(val ? "True" : "False");
}); });
_vm->bind__and__(VM::tp_bool, [](VM* vm, PyObject* lhs, PyObject* rhs) { _vm->bind__and__(VM::tp_bool, [](VM* vm, PyObject* _0, PyObject* _1) {
return VAR(_CAST(bool, lhs) && CAST(bool, rhs)); return VAR(_CAST(bool, _0) && CAST(bool, _1));
}); });
_vm->bind__or__(VM::tp_bool, [](VM* vm, PyObject* lhs, PyObject* rhs) { _vm->bind__or__(VM::tp_bool, [](VM* vm, PyObject* _0, PyObject* _1) {
return VAR(_CAST(bool, lhs) || CAST(bool, rhs)); return VAR(_CAST(bool, _0) || CAST(bool, _1));
}); });
_vm->bind__xor__(VM::tp_bool, [](VM* vm, PyObject* lhs, PyObject* rhs) { _vm->bind__xor__(VM::tp_bool, [](VM* vm, PyObject* _0, PyObject* _1) {
return VAR(_CAST(bool, lhs) != CAST(bool, rhs)); return VAR(_CAST(bool, _0) != CAST(bool, _1));
}); });
_vm->bind__eq__(VM::tp_bool, [](VM* vm, PyObject* lhs, PyObject* rhs) { _vm->bind__eq__(VM::tp_bool, [](VM* vm, PyObject* _0, PyObject* _1) {
if(is_non_tagged_type(rhs, vm->tp_bool)) return VAR(lhs == rhs); if(is_non_tagged_type(_1, vm->tp_bool)) return VAR(_0 == _1);
if(is_int(rhs)) return VAR(_CAST(bool, lhs) == (bool)CAST(i64, rhs)); if(is_int(_1)) return VAR(_CAST(bool, _0) == (bool)CAST(i64, _1));
return vm->NotImplemented; return vm->NotImplemented;
}); });
// tp_ellipsis / tp_NotImplementedType // tp_ellipsis / tp_NotImplementedType
_vm->bind__repr__(_vm->_tp(_vm->Ellipsis), [](VM* vm, PyObject* self) { _vm->bind__repr__(_vm->_tp(_vm->Ellipsis), [](VM* vm, PyObject* _0) {
return VAR("..."); return VAR("...");
}); });
_vm->bind__repr__(_vm->_tp(_vm->NotImplemented), [](VM* vm, PyObject* self) { _vm->bind__repr__(_vm->_tp(_vm->NotImplemented), [](VM* vm, PyObject* _0) {
return VAR("NotImplemented"); return VAR("NotImplemented");
}); });
@ -977,14 +980,14 @@ void init_builtins(VM* _vm) {
return VAR(self[i]); return VAR(self[i]);
}); });
_vm->bind__hash__(VM::tp_bytes, [](VM* vm, PyObject* obj) { _vm->bind__hash__(VM::tp_bytes, [](VM* vm, PyObject* _0) {
const Bytes& self = _CAST(Bytes&, obj); const Bytes& self = _CAST(Bytes&, _0);
std::string_view view((char*)self.data(), self.size()); std::string_view view((char*)self.data(), self.size());
return (i64)std::hash<std::string_view>()(view); return (i64)std::hash<std::string_view>()(view);
}); });
_vm->bind__repr__(VM::tp_bytes, [](VM* vm, PyObject* obj) { _vm->bind__repr__(VM::tp_bytes, [](VM* vm, PyObject* _0) {
const Bytes& self = _CAST(Bytes&, obj); const Bytes& self = _CAST(Bytes&, _0);
SStream ss; SStream ss;
ss << "b'"; ss << "b'";
for(int i=0; i<self.size(); i++){ for(int i=0; i<self.size(); i++){
@ -994,8 +997,8 @@ void init_builtins(VM* _vm) {
ss << "'"; ss << "'";
return VAR(ss.str()); return VAR(ss.str());
}); });
_vm->bind__len__(VM::tp_bytes, [](VM* vm, PyObject* obj) { _vm->bind__len__(VM::tp_bytes, [](VM* vm, PyObject* _0) {
return (i64)_CAST(Bytes&, obj).size(); return (i64)_CAST(Bytes&, _0).size();
}); });
_vm->bind_method<0>(VM::tp_bytes, "decode", [](VM* vm, ArgsView args) { _vm->bind_method<0>(VM::tp_bytes, "decode", [](VM* vm, ArgsView args) {
@ -1004,9 +1007,9 @@ void init_builtins(VM* _vm) {
return VAR(Str(self.str())); return VAR(Str(self.str()));
}); });
_vm->bind__eq__(VM::tp_bytes, [](VM* vm, PyObject* lhs, PyObject* rhs) { _vm->bind__eq__(VM::tp_bytes, [](VM* vm, PyObject* _0, PyObject* _1) {
if(!is_non_tagged_type(rhs, vm->tp_bytes)) return vm->NotImplemented; if(!is_non_tagged_type(_1, vm->tp_bytes)) return vm->NotImplemented;
return VAR(_CAST(Bytes&, lhs) == _CAST(Bytes&, rhs)); return VAR(_CAST(Bytes&, _0) == _CAST(Bytes&, _1));
}); });
// tp_slice // tp_slice
@ -1014,8 +1017,8 @@ void init_builtins(VM* _vm) {
return VAR(Slice(args[1], args[2], args[3])); return VAR(Slice(args[1], args[2], args[3]));
}); });
_vm->bind__repr__(VM::tp_slice, [](VM* vm, PyObject* obj) { _vm->bind__repr__(VM::tp_slice, [](VM* vm, PyObject* _0) {
const Slice& self = _CAST(Slice&, obj); const Slice& self = _CAST(Slice&, _0);
SStream ss; SStream ss;
ss << "slice("; ss << "slice(";
ss << CAST(Str, vm->py_repr(self.start)) << ", "; ss << CAST(Str, vm->py_repr(self.start)) << ", ";
@ -1049,22 +1052,22 @@ void init_builtins(VM* _vm) {
return VAR(std::move(items)); return VAR(std::move(items));
}); });
_vm->bind__len__(VM::tp_mappingproxy, [](VM* vm, PyObject* obj) { _vm->bind__len__(VM::tp_mappingproxy, [](VM* vm, PyObject* _0) {
return (i64)_CAST(MappingProxy&, obj).attr().size(); return (i64)_CAST(MappingProxy&, _0).attr().size();
}); });
_vm->bind__eq__(VM::tp_mappingproxy, [](VM* vm, PyObject* obj, PyObject* other){ _vm->bind__eq__(VM::tp_mappingproxy, [](VM* vm, PyObject* _0, PyObject* _1){
const MappingProxy& a = _CAST(MappingProxy&, obj); const MappingProxy& a = _CAST(MappingProxy&, _0);
if(!is_non_tagged_type(other, vm->tp_mappingproxy)) return vm->NotImplemented; if(!is_non_tagged_type(_1, vm->tp_mappingproxy)) return vm->NotImplemented;
const MappingProxy& b = _CAST(MappingProxy&, other); const MappingProxy& b = _CAST(MappingProxy&, _1);
return VAR(a.obj == b.obj); return VAR(a.obj == b.obj);
}); });
_vm->bind__getitem__(VM::tp_mappingproxy, [](VM* vm, PyObject* obj, PyObject* index) { _vm->bind__getitem__(VM::tp_mappingproxy, [](VM* vm, PyObject* _0, PyObject* _1) {
MappingProxy& self = _CAST(MappingProxy&, obj); MappingProxy& self = _CAST(MappingProxy&, _0);
StrName key = CAST(Str&, index); StrName key = CAST(Str&, _1);
PyObject* ret = self.attr().try_get_likely_found(key); PyObject* ret = self.attr().try_get_likely_found(key);
if(ret == nullptr) vm->KeyError(index); if(ret == nullptr) vm->KeyError(_1);
return ret; return ret;
}); });
@ -1076,23 +1079,24 @@ void init_builtins(VM* _vm) {
return ret; return ret;
}); });
_vm->bind__repr__(VM::tp_mappingproxy, [](VM* vm, PyObject* obj) { _vm->bind__repr__(VM::tp_mappingproxy, [](VM* vm, PyObject* _0) {
MappingProxy& self = _CAST(MappingProxy&, obj); MappingProxy& self = _CAST(MappingProxy&, _0);
SStream ss; SStream ss;
ss << "mappingproxy({"; ss << "mappingproxy({";
bool first = true; bool first = true;
for(auto& item : self.attr().items()){ for(auto& item : self.attr().items()){
if(!first) ss << ", "; if(!first) ss << ", ";
first = false; first = false;
ss << item.first.escape() << ": " << CAST(Str, vm->py_repr(item.second)); ss << item.first.escape() << ": ";
ss << CAST(Str, vm->py_repr(item.second));
} }
ss << "})"; ss << "})";
return VAR(ss.str()); return VAR(ss.str());
}); });
_vm->bind__contains__(VM::tp_mappingproxy, [](VM* vm, PyObject* obj, PyObject* key) { _vm->bind__contains__(VM::tp_mappingproxy, [](VM* vm, PyObject* _0, PyObject* _1) {
MappingProxy& self = _CAST(MappingProxy&, obj); MappingProxy& self = _CAST(MappingProxy&, _0);
return VAR(self.attr().contains(CAST(Str&, key))); return VAR(self.attr().contains(CAST(Str&, _1)));
}); });
// tp_dict // tp_dict
@ -1120,26 +1124,26 @@ void init_builtins(VM* _vm) {
return vm->None; return vm->None;
}); });
_vm->bind__len__(VM::tp_dict, [](VM* vm, PyObject* obj) { _vm->bind__len__(VM::tp_dict, [](VM* vm, PyObject* _0) {
return (i64)_CAST(Dict&, obj).size(); return (i64)_CAST(Dict&, _0).size();
}); });
_vm->bind__getitem__(VM::tp_dict, [](VM* vm, PyObject* obj, PyObject* index) { _vm->bind__getitem__(VM::tp_dict, [](VM* vm, PyObject* _0, PyObject* _1) {
Dict& self = _CAST(Dict&, obj); Dict& self = _CAST(Dict&, _0);
PyObject* ret = self.try_get(index); PyObject* ret = self.try_get(_1);
if(ret == nullptr) vm->KeyError(index); if(ret == nullptr) vm->KeyError(_1);
return ret; return ret;
}); });
_vm->bind__setitem__(VM::tp_dict, [](VM* vm, PyObject* obj, PyObject* key, PyObject* value) { _vm->bind__setitem__(VM::tp_dict, [](VM* vm, PyObject* _0, PyObject* _1, PyObject* _2) {
Dict& self = _CAST(Dict&, obj); Dict& self = _CAST(Dict&, _0);
self.set(key, value); self.set(_1, _2);
}); });
_vm->bind__delitem__(VM::tp_dict, [](VM* vm, PyObject* obj, PyObject* key) { _vm->bind__delitem__(VM::tp_dict, [](VM* vm, PyObject* _0, PyObject* _1) {
Dict& self = _CAST(Dict&, obj); Dict& self = _CAST(Dict&, _0);
bool ok = self.erase(key); bool ok = self.erase(_1);
if(!ok) vm->KeyError(key); if(!ok) vm->KeyError(_1);
}); });
_vm->bind_method<-1>(VM::tp_dict, "pop", [](VM* vm, ArgsView args) { _vm->bind_method<-1>(VM::tp_dict, "pop", [](VM* vm, ArgsView args) {
@ -1159,13 +1163,13 @@ void init_builtins(VM* _vm) {
return value; return value;
}); });
_vm->bind__contains__(VM::tp_dict, [](VM* vm, PyObject* obj, PyObject* key) { _vm->bind__contains__(VM::tp_dict, [](VM* vm, PyObject* _0, PyObject* _1) {
Dict& self = _CAST(Dict&, obj); Dict& self = _CAST(Dict&, _0);
return VAR(self.contains(key)); return VAR(self.contains(_1));
}); });
_vm->bind__iter__(VM::tp_dict, [](VM* vm, PyObject* obj) { _vm->bind__iter__(VM::tp_dict, [](VM* vm, PyObject* _0) {
const Dict& self = _CAST(Dict&, obj); const Dict& self = _CAST(Dict&, _0);
return vm->py_iter(VAR(self.keys())); return vm->py_iter(VAR(self.keys()));
}); });
@ -1222,28 +1226,29 @@ void init_builtins(VM* _vm) {
return vm->None; return vm->None;
}); });
_vm->bind__repr__(VM::tp_dict, [](VM* vm, PyObject* obj) { _vm->bind__repr__(VM::tp_dict, [](VM* vm, PyObject* _0) {
Dict& self = _CAST(Dict&, obj); Dict& self = _CAST(Dict&, _0);
SStream ss; SStream ss;
ss << "{"; ss << "{";
bool first = true; bool first = true;
self.apply([&](PyObject* k, PyObject* v){ self.apply([&](PyObject* k, PyObject* v){
if(!first) ss << ", "; if(!first) ss << ", ";
first = false; first = false;
Str key = CAST(Str&, vm->py_repr(k)); ss << CAST(Str&, vm->py_repr(k)) << ": ";
Str value = CAST(Str&, vm->py_repr(v)); if(v == _0){
ss << key << ": " << value; ss << "{...}";
}else{
ss << CAST(Str&, vm->py_repr(v));
}
}); });
ss << "}"; ss << "}";
return VAR(ss.str()); return VAR(ss.str());
}); });
_vm->bind__eq__(VM::tp_dict, [](VM* vm, PyObject* a, PyObject* b) { _vm->bind__eq__(VM::tp_dict, [](VM* vm, PyObject* _0, PyObject* _1) {
Dict& self = _CAST(Dict&, a); Dict& self = _CAST(Dict&, _0);
if(!is_non_tagged_type(b, vm->tp_dict)) return vm->NotImplemented; if(!is_non_tagged_type(_1, vm->tp_dict)) return vm->NotImplemented;
Dict& other = _CAST(Dict&, b); Dict& other = _CAST(Dict&, _1);
if(self.size() != other.size()) return vm->False; if(self.size() != other.size()) return vm->False;
for(int i=0; i<self._capacity; i++){ for(int i=0; i<self._capacity; i++){
auto item = self._items[i]; auto item = self._items[i];
@ -1255,8 +1260,8 @@ void init_builtins(VM* _vm) {
return vm->True; return vm->True;
}); });
_vm->bind__repr__(VM::tp_module, [](VM* vm, PyObject* obj) { _vm->bind__repr__(VM::tp_module, [](VM* vm, PyObject* _0) {
const Str& path = CAST(Str&, obj->attr(__path__)); const Str& path = CAST(Str&, _0->attr(__path__));
return VAR(fmt("<module ", path.escape(), ">")); return VAR(fmt("<module ", path.escape(), ">"));
}); });
@ -1321,13 +1326,13 @@ void init_builtins(VM* _vm) {
return vm->None; return vm->None;
}); });
_vm->bind__repr__(VM::tp_exception, [](VM* vm, PyObject* obj) { _vm->bind__repr__(VM::tp_exception, [](VM* vm, PyObject* _0) {
Exception& self = _CAST(Exception&, obj); Exception& self = _CAST(Exception&, _0);
return VAR(fmt(_type_name(vm, obj->type), '(', self.msg.escape(), ')')); return VAR(fmt(_type_name(vm, _0->type), '(', self.msg.escape(), ')'));
}); });
_vm->bind__str__(VM::tp_exception, [](VM* vm, PyObject* obj) { _vm->bind__str__(VM::tp_exception, [](VM* vm, PyObject* _0) {
Exception& self = _CAST(Exception&, obj); Exception& self = _CAST(Exception&, _0);
return VAR(self.msg); return VAR(self.msg);
}); });

View File

@ -95,3 +95,9 @@ assert b[0
assert b[0] == 1 assert b[0] == 1
assert b[ assert b[
0] == 1 0] == 1
a = []
a.append(1)
a.append(a)
assert repr(a) == '[1, [...]]'

View File

@ -156,3 +156,7 @@ try:
exit(1) exit(1)
except TypeError: except TypeError:
pass pass
a = {1: 2, 3: 4}
a['a'] = a
assert repr(a) == "{1: 2, 3: 4, 'a': {...}}"