mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
...
This commit is contained in:
parent
3c5c536a05
commit
6455d40900
325
src/pocketpy.cpp
325
src/pocketpy.cpp
@ -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++){
|
||||||
|
if(iterable[i] == _0){
|
||||||
|
ss << "[...]";
|
||||||
|
}else{
|
||||||
ss << CAST(Str&, vm->py_repr(iterable[i]));
|
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);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -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, [...]]'
|
||||||
|
@ -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': {...}}"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user