mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
add bytes
This commit is contained in:
parent
5faac18935
commit
d70b7653f2
@ -57,6 +57,13 @@ struct Range {
|
|||||||
i64 step = 1;
|
i64 step = 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct Bytes{
|
||||||
|
std::string _data;
|
||||||
|
|
||||||
|
int size() const noexcept { return _data.size(); }
|
||||||
|
int operator[](int i) const noexcept { return (int)(uint8_t)_data[i]; }
|
||||||
|
};
|
||||||
|
|
||||||
using Super = std::pair<PyObject*, Type>;
|
using Super = std::pair<PyObject*, Type>;
|
||||||
|
|
||||||
// TODO: re-examine the design of Slice
|
// TODO: re-examine the design of Slice
|
||||||
|
@ -412,6 +412,11 @@ inline void init_builtins(VM* _vm) {
|
|||||||
return VAR(ok);
|
return VAR(ok);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_vm->bind_method<0>("str", "encode", [](VM* vm, ArgsView args) {
|
||||||
|
const Str& self = CAST(Str&, args[0]);
|
||||||
|
return VAR(Bytes{self.str()});
|
||||||
|
});
|
||||||
|
|
||||||
_vm->bind_method<1>("str", "join", [](VM* vm, ArgsView args) {
|
_vm->bind_method<1>("str", "join", [](VM* vm, ArgsView args) {
|
||||||
const Str& self = CAST(Str&, args[0]);
|
const Str& self = CAST(Str&, args[0]);
|
||||||
FastStrStream ss;
|
FastStrStream ss;
|
||||||
@ -551,7 +556,7 @@ inline void init_builtins(VM* _vm) {
|
|||||||
return VAR(self.size());
|
return VAR(self.size());
|
||||||
});
|
});
|
||||||
|
|
||||||
/************ PyBool ************/
|
/************ bool ************/
|
||||||
_vm->bind_static_method<1>("bool", "__new__", CPP_LAMBDA(VAR(vm->asBool(args[0]))));
|
_vm->bind_static_method<1>("bool", "__new__", CPP_LAMBDA(VAR(vm->asBool(args[0]))));
|
||||||
|
|
||||||
_vm->bind_method<0>("bool", "__repr__", [](VM* vm, ArgsView args) {
|
_vm->bind_method<0>("bool", "__repr__", [](VM* vm, ArgsView args) {
|
||||||
@ -571,6 +576,39 @@ inline void init_builtins(VM* _vm) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
_vm->bind_method<0>("ellipsis", "__repr__", CPP_LAMBDA(VAR("Ellipsis")));
|
_vm->bind_method<0>("ellipsis", "__repr__", CPP_LAMBDA(VAR("Ellipsis")));
|
||||||
|
|
||||||
|
/************ bytes ************/
|
||||||
|
_vm->bind_static_method<1>("bytes", "__new__", CPP_NOT_IMPLEMENTED());
|
||||||
|
|
||||||
|
_vm->bind_method<1>("bytes", "__getitem__", [](VM* vm, ArgsView args) {
|
||||||
|
const Bytes& self = CAST(Bytes&, args[0]);
|
||||||
|
int index = CAST(int, args[1]);
|
||||||
|
index = vm->normalized_index(index, self.size());
|
||||||
|
return VAR(self[index]);
|
||||||
|
});
|
||||||
|
|
||||||
|
_vm->bind_method<0>("bytes", "__repr__", [](VM* vm, ArgsView args) {
|
||||||
|
const Bytes& self = CAST(Bytes&, args[0]);
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << "b'";
|
||||||
|
for(int i=0; i<self.size(); i++){
|
||||||
|
ss << "\\x" << std::hex << std::setw(2) << std::setfill('0') << self[i];
|
||||||
|
}
|
||||||
|
ss << "'";
|
||||||
|
return VAR(ss.str());
|
||||||
|
});
|
||||||
|
|
||||||
|
_vm->bind_method<0>("bytes", "__len__", [](VM* vm, ArgsView args) {
|
||||||
|
const Bytes& self = CAST(Bytes&, args[0]);
|
||||||
|
return VAR(self.size());
|
||||||
|
});
|
||||||
|
|
||||||
|
_vm->bind_method<0>("bytes", "decode", [](VM* vm, ArgsView args) {
|
||||||
|
const Bytes& self = CAST(Bytes&, args[0]);
|
||||||
|
// TODO: check encoding is utf-8
|
||||||
|
return VAR(Str(self._data));
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
@ -207,11 +207,10 @@ struct Str{
|
|||||||
case '\r': ss << "\\r"; break;
|
case '\r': ss << "\\r"; break;
|
||||||
case '\t': ss << "\\t"; break;
|
case '\t': ss << "\\t"; break;
|
||||||
default:
|
default:
|
||||||
if ('\x00' <= c && c <= '\x1f') {
|
if (c >= 32 && c <= 126) {
|
||||||
ss << "\\u"
|
|
||||||
<< std::hex << std::setw(4) << std::setfill('0') << static_cast<int>(c);
|
|
||||||
} else {
|
|
||||||
ss << c;
|
ss << c;
|
||||||
|
} else {
|
||||||
|
ss << "\\x" << std::hex << std::setw(2) << std::setfill('0') << (int)(uint8_t)c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
5
src/vm.h
5
src/vm.h
@ -102,7 +102,7 @@ public:
|
|||||||
Type tp_list, tp_tuple;
|
Type tp_list, tp_tuple;
|
||||||
Type tp_function, tp_native_func, tp_iterator, tp_bound_method;
|
Type tp_function, tp_native_func, tp_iterator, tp_bound_method;
|
||||||
Type tp_slice, tp_range, tp_module;
|
Type tp_slice, tp_range, tp_module;
|
||||||
Type tp_super, tp_exception;
|
Type tp_super, tp_exception, tp_bytes;
|
||||||
|
|
||||||
VM(bool use_stdio) : heap(this){
|
VM(bool use_stdio) : heap(this){
|
||||||
this->vm = this;
|
this->vm = this;
|
||||||
@ -412,6 +412,7 @@ DEF_NATIVE_2(BoundMethod, tp_bound_method)
|
|||||||
DEF_NATIVE_2(Range, tp_range)
|
DEF_NATIVE_2(Range, tp_range)
|
||||||
DEF_NATIVE_2(Slice, tp_slice)
|
DEF_NATIVE_2(Slice, tp_slice)
|
||||||
DEF_NATIVE_2(Exception, tp_exception)
|
DEF_NATIVE_2(Exception, tp_exception)
|
||||||
|
DEF_NATIVE_2(Bytes, tp_bytes)
|
||||||
|
|
||||||
#define PY_CAST_INT(T) \
|
#define PY_CAST_INT(T) \
|
||||||
template<> inline T py_cast<T>(VM* vm, PyObject* obj){ \
|
template<> inline T py_cast<T>(VM* vm, PyObject* obj){ \
|
||||||
@ -737,6 +738,7 @@ inline void VM::init_builtin_types(){
|
|||||||
tp_bound_method = _new_type_object("bound_method");
|
tp_bound_method = _new_type_object("bound_method");
|
||||||
tp_super = _new_type_object("super");
|
tp_super = _new_type_object("super");
|
||||||
tp_exception = _new_type_object("Exception");
|
tp_exception = _new_type_object("Exception");
|
||||||
|
tp_bytes = _new_type_object("bytes");
|
||||||
|
|
||||||
this->None = heap._new<Dummy>(_new_type_object("NoneType"), {});
|
this->None = heap._new<Dummy>(_new_type_object("NoneType"), {});
|
||||||
this->Ellipsis = heap._new<Dummy>(_new_type_object("ellipsis"), {});
|
this->Ellipsis = heap._new<Dummy>(_new_type_object("ellipsis"), {});
|
||||||
@ -757,6 +759,7 @@ inline void VM::init_builtin_types(){
|
|||||||
builtins->attr().set("list", _t(tp_list));
|
builtins->attr().set("list", _t(tp_list));
|
||||||
builtins->attr().set("tuple", _t(tp_tuple));
|
builtins->attr().set("tuple", _t(tp_tuple));
|
||||||
builtins->attr().set("range", _t(tp_range));
|
builtins->attr().set("range", _t(tp_range));
|
||||||
|
builtins->attr().set("bytes", _t(tp_bytes));
|
||||||
builtins->attr().set("StopIteration", StopIteration);
|
builtins->attr().set("StopIteration", StopIteration);
|
||||||
|
|
||||||
post_init();
|
post_init();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user