mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 12:00:18 +00:00
disable code serialization impl
This commit is contained in:
parent
02798c5b00
commit
0157025097
@ -57,43 +57,43 @@ struct FuncDecl;
|
|||||||
using CodeObject_ = std::shared_ptr<CodeObject>;
|
using CodeObject_ = std::shared_ptr<CodeObject>;
|
||||||
using FuncDecl_ = std::shared_ptr<FuncDecl>;
|
using FuncDecl_ = std::shared_ptr<FuncDecl>;
|
||||||
|
|
||||||
struct CodeObjectSerializer{
|
// struct CodeObjectSerializer{
|
||||||
std::string buffer;
|
// std::string buffer;
|
||||||
int depth = 0;
|
// int depth = 0;
|
||||||
|
|
||||||
std::set<StrName> names;
|
// std::set<StrName> names;
|
||||||
|
|
||||||
static const char END = '\n';
|
// static const char END = '\n';
|
||||||
|
|
||||||
CodeObjectSerializer();
|
// CodeObjectSerializer();
|
||||||
|
|
||||||
void write_int(i64 v);
|
// void write_int(i64 v);
|
||||||
void write_float(f64 v);
|
// void write_float(f64 v);
|
||||||
void write_str(const Str& v);
|
// void write_str(const Str& v);
|
||||||
void write_none();
|
// void write_none();
|
||||||
void write_ellipsis();
|
// void write_ellipsis();
|
||||||
void write_bool(bool v);
|
// void write_bool(bool v);
|
||||||
void write_begin_mark();
|
// void write_begin_mark();
|
||||||
void write_name(StrName name);
|
// void write_name(StrName name);
|
||||||
void write_end_mark();
|
// void write_end_mark();
|
||||||
|
|
||||||
template<typename T>
|
// template<typename T>
|
||||||
void write_bytes(T v){
|
// void write_bytes(T v){
|
||||||
static_assert(std::is_trivially_copyable<T>::value);
|
// static_assert(std::is_trivially_copyable<T>::value);
|
||||||
buffer += 'x';
|
// buffer += 'x';
|
||||||
char* p = (char*)&v;
|
// char* p = (char*)&v;
|
||||||
for(int i=0; i<sizeof(T); i++){
|
// for(int i=0; i<sizeof(T); i++){
|
||||||
char c = p[i];
|
// char c = p[i];
|
||||||
buffer += "0123456789abcdef"[(c >> 4) & 0xf];
|
// buffer += "0123456789abcdef"[(c >> 4) & 0xf];
|
||||||
buffer += "0123456789abcdef"[c & 0xf];
|
// buffer += "0123456789abcdef"[c & 0xf];
|
||||||
}
|
// }
|
||||||
buffer += END;
|
// buffer += END;
|
||||||
}
|
// }
|
||||||
|
|
||||||
void write_object(VM* vm, PyObject* obj);
|
// void write_object(VM* vm, PyObject* obj);
|
||||||
void write_code(VM* vm, const CodeObject* co);
|
// void write_code(VM* vm, const CodeObject* co);
|
||||||
std::string str();
|
// std::string str();
|
||||||
};
|
// };
|
||||||
|
|
||||||
|
|
||||||
struct CodeObject {
|
struct CodeObject {
|
||||||
@ -117,8 +117,8 @@ struct CodeObject {
|
|||||||
|
|
||||||
CodeObject(std::shared_ptr<SourceData> src, const Str& name);
|
CodeObject(std::shared_ptr<SourceData> src, const Str& name);
|
||||||
void _gc_mark() const;
|
void _gc_mark() const;
|
||||||
void write(VM* vm, CodeObjectSerializer& ss) const;
|
// void write(VM* vm, CodeObjectSerializer& ss) const;
|
||||||
Str serialize(VM* vm) const;
|
// Str serialize(VM* vm) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FuncDecl {
|
struct FuncDecl {
|
||||||
|
@ -10,150 +10,6 @@ namespace pkpy{
|
|||||||
for(auto& decl: func_decls) decl->_gc_mark();
|
for(auto& decl: func_decls) decl->_gc_mark();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeObject::write(VM* vm, CodeObjectSerializer& ss) const{
|
|
||||||
ss.write_begin_mark(); // [
|
|
||||||
ss.write_str(src->filename); // src->filename
|
|
||||||
ss.write_int(src->mode); // src->mode
|
|
||||||
ss.write_end_mark(); // ]
|
|
||||||
ss.write_str(name); // name
|
|
||||||
ss.write_bool(is_generator); // is_generator
|
|
||||||
ss.write_begin_mark(); // [
|
|
||||||
for(Bytecode bc: codes){
|
|
||||||
if(StrName::is_valid(bc.arg)) ss.names.insert(StrName(bc.arg));
|
|
||||||
ss.write_bytes(bc);
|
|
||||||
}
|
|
||||||
ss.write_end_mark(); // ]
|
|
||||||
ss.write_begin_mark(); // [
|
|
||||||
for(int line: lines){
|
|
||||||
ss.write_int(line); // line
|
|
||||||
}
|
|
||||||
ss.write_end_mark(); // ]
|
|
||||||
ss.write_begin_mark(); // [
|
|
||||||
for(PyObject* o: consts){
|
|
||||||
ss.write_object(vm, o);
|
|
||||||
}
|
|
||||||
ss.write_end_mark(); // ]
|
|
||||||
ss.write_begin_mark(); // [
|
|
||||||
for(StrName vn: varnames){
|
|
||||||
ss.write_name(vn); // name
|
|
||||||
}
|
|
||||||
ss.write_end_mark(); // ]
|
|
||||||
ss.write_begin_mark(); // [
|
|
||||||
for(CodeBlock block: blocks){
|
|
||||||
ss.write_bytes(block); // block
|
|
||||||
}
|
|
||||||
ss.write_end_mark(); // ]
|
|
||||||
ss.write_begin_mark(); // [
|
|
||||||
for(auto& label: labels.items()){
|
|
||||||
ss.write_name(label.first); // label.first
|
|
||||||
ss.write_int(label.second); // label.second
|
|
||||||
}
|
|
||||||
ss.write_end_mark(); // ]
|
|
||||||
ss.write_begin_mark(); // [
|
|
||||||
for(auto& decl: func_decls){
|
|
||||||
ss.write_code(vm, decl->code.get()); // decl->code
|
|
||||||
ss.write_begin_mark(); // [
|
|
||||||
for(int arg: decl->args) ss.write_int(arg);
|
|
||||||
ss.write_end_mark(); // ]
|
|
||||||
|
|
||||||
ss.write_begin_mark(); // [
|
|
||||||
for(auto kw: decl->kwargs){
|
|
||||||
ss.write_int(kw.key); // kw.key
|
|
||||||
ss.write_object(vm, kw.value); // kw.value
|
|
||||||
}
|
|
||||||
ss.write_end_mark(); // ]
|
|
||||||
|
|
||||||
ss.write_int(decl->starred_arg);
|
|
||||||
ss.write_int(decl->starred_kwarg);
|
|
||||||
ss.write_bool(decl->nested);
|
|
||||||
}
|
|
||||||
ss.write_end_mark(); // ]
|
|
||||||
}
|
|
||||||
|
|
||||||
Str CodeObject::serialize(VM* vm) const{
|
|
||||||
CodeObjectSerializer ss;
|
|
||||||
ss.write_code(vm, this);
|
|
||||||
return ss.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void CodeObjectSerializer::write_int(i64 v){
|
|
||||||
buffer += 'i';
|
|
||||||
buffer += std::to_string(v);
|
|
||||||
buffer += END;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CodeObjectSerializer::write_float(f64 v){
|
|
||||||
buffer += 'f';
|
|
||||||
buffer += std::to_string(v);
|
|
||||||
buffer += END;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CodeObjectSerializer::write_str(const Str& v){
|
|
||||||
buffer += 's';
|
|
||||||
buffer += v.escape(false).str();
|
|
||||||
buffer += END;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CodeObjectSerializer::write_none(){
|
|
||||||
buffer += 'N';
|
|
||||||
buffer += END;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CodeObjectSerializer::write_ellipsis(){
|
|
||||||
buffer += 'E';
|
|
||||||
buffer += END;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CodeObjectSerializer::write_bool(bool v){
|
|
||||||
buffer += 'b';
|
|
||||||
buffer += v ? '1' : '0';
|
|
||||||
buffer += END;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CodeObjectSerializer::write_begin_mark(){
|
|
||||||
buffer += '[';
|
|
||||||
buffer += END;
|
|
||||||
depth++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CodeObjectSerializer::write_name(StrName name){
|
|
||||||
PK_ASSERT(StrName::is_valid(name.index));
|
|
||||||
buffer += 'n';
|
|
||||||
buffer += std::to_string(name.index);
|
|
||||||
buffer += END;
|
|
||||||
names.insert(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CodeObjectSerializer::write_end_mark(){
|
|
||||||
buffer += ']';
|
|
||||||
buffer += END;
|
|
||||||
depth--;
|
|
||||||
PK_ASSERT(depth >= 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string CodeObjectSerializer::str(){
|
|
||||||
PK_ASSERT(depth == 0);
|
|
||||||
for(auto name: names){
|
|
||||||
PK_ASSERT(StrName::is_valid(name.index));
|
|
||||||
write_name(name);
|
|
||||||
write_str(name.sv());
|
|
||||||
}
|
|
||||||
return std::move(buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
CodeObjectSerializer::CodeObjectSerializer(){
|
|
||||||
write_str(PK_VERSION);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CodeObjectSerializer::write_code(VM* vm, const CodeObject* co){
|
|
||||||
buffer += '(';
|
|
||||||
buffer += END;
|
|
||||||
co->write(vm, *this);
|
|
||||||
buffer += ')';
|
|
||||||
buffer += END;
|
|
||||||
}
|
|
||||||
|
|
||||||
NativeFunc::NativeFunc(NativeFuncC f, int argc, bool method){
|
NativeFunc::NativeFunc(NativeFuncC f, int argc, bool method){
|
||||||
this->f = f;
|
this->f = f;
|
||||||
this->argc = argc;
|
this->argc = argc;
|
||||||
@ -166,4 +22,149 @@ void CodeObjectSerializer::write_code(VM* vm, const CodeObject* co){
|
|||||||
this->decl = decl;
|
this->decl = decl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// void CodeObject::write(VM* vm, CodeObjectSerializer& ss) const{
|
||||||
|
// ss.write_begin_mark(); // [
|
||||||
|
// ss.write_str(src->filename); // src->filename
|
||||||
|
// ss.write_int(src->mode); // src->mode
|
||||||
|
// ss.write_end_mark(); // ]
|
||||||
|
// ss.write_str(name); // name
|
||||||
|
// ss.write_bool(is_generator); // is_generator
|
||||||
|
// ss.write_begin_mark(); // [
|
||||||
|
// for(Bytecode bc: codes){
|
||||||
|
// if(StrName::is_valid(bc.arg)) ss.names.insert(StrName(bc.arg));
|
||||||
|
// ss.write_bytes(bc);
|
||||||
|
// }
|
||||||
|
// ss.write_end_mark(); // ]
|
||||||
|
// ss.write_begin_mark(); // [
|
||||||
|
// for(int line: lines){
|
||||||
|
// ss.write_int(line); // line
|
||||||
|
// }
|
||||||
|
// ss.write_end_mark(); // ]
|
||||||
|
// ss.write_begin_mark(); // [
|
||||||
|
// for(PyObject* o: consts){
|
||||||
|
// ss.write_object(vm, o);
|
||||||
|
// }
|
||||||
|
// ss.write_end_mark(); // ]
|
||||||
|
// ss.write_begin_mark(); // [
|
||||||
|
// for(StrName vn: varnames){
|
||||||
|
// ss.write_name(vn); // name
|
||||||
|
// }
|
||||||
|
// ss.write_end_mark(); // ]
|
||||||
|
// ss.write_begin_mark(); // [
|
||||||
|
// for(CodeBlock block: blocks){
|
||||||
|
// ss.write_bytes(block); // block
|
||||||
|
// }
|
||||||
|
// ss.write_end_mark(); // ]
|
||||||
|
// ss.write_begin_mark(); // [
|
||||||
|
// for(auto& label: labels.items()){
|
||||||
|
// ss.write_name(label.first); // label.first
|
||||||
|
// ss.write_int(label.second); // label.second
|
||||||
|
// }
|
||||||
|
// ss.write_end_mark(); // ]
|
||||||
|
// ss.write_begin_mark(); // [
|
||||||
|
// for(auto& decl: func_decls){
|
||||||
|
// ss.write_code(vm, decl->code.get()); // decl->code
|
||||||
|
// ss.write_begin_mark(); // [
|
||||||
|
// for(int arg: decl->args) ss.write_int(arg);
|
||||||
|
// ss.write_end_mark(); // ]
|
||||||
|
|
||||||
|
// ss.write_begin_mark(); // [
|
||||||
|
// for(auto kw: decl->kwargs){
|
||||||
|
// ss.write_int(kw.key); // kw.key
|
||||||
|
// ss.write_object(vm, kw.value); // kw.value
|
||||||
|
// }
|
||||||
|
// ss.write_end_mark(); // ]
|
||||||
|
|
||||||
|
// ss.write_int(decl->starred_arg);
|
||||||
|
// ss.write_int(decl->starred_kwarg);
|
||||||
|
// ss.write_bool(decl->nested);
|
||||||
|
// }
|
||||||
|
// ss.write_end_mark(); // ]
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Str CodeObject::serialize(VM* vm) const{
|
||||||
|
// CodeObjectSerializer ss;
|
||||||
|
// ss.write_code(vm, this);
|
||||||
|
// return ss.str();
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
// void CodeObjectSerializer::write_int(i64 v){
|
||||||
|
// buffer += 'i';
|
||||||
|
// buffer += std::to_string(v);
|
||||||
|
// buffer += END;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void CodeObjectSerializer::write_float(f64 v){
|
||||||
|
// buffer += 'f';
|
||||||
|
// buffer += std::to_string(v);
|
||||||
|
// buffer += END;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void CodeObjectSerializer::write_str(const Str& v){
|
||||||
|
// buffer += 's';
|
||||||
|
// buffer += v.escape(false).str();
|
||||||
|
// buffer += END;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void CodeObjectSerializer::write_none(){
|
||||||
|
// buffer += 'N';
|
||||||
|
// buffer += END;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void CodeObjectSerializer::write_ellipsis(){
|
||||||
|
// buffer += 'E';
|
||||||
|
// buffer += END;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void CodeObjectSerializer::write_bool(bool v){
|
||||||
|
// buffer += 'b';
|
||||||
|
// buffer += v ? '1' : '0';
|
||||||
|
// buffer += END;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void CodeObjectSerializer::write_begin_mark(){
|
||||||
|
// buffer += '[';
|
||||||
|
// buffer += END;
|
||||||
|
// depth++;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void CodeObjectSerializer::write_name(StrName name){
|
||||||
|
// PK_ASSERT(StrName::is_valid(name.index));
|
||||||
|
// buffer += 'n';
|
||||||
|
// buffer += std::to_string(name.index);
|
||||||
|
// buffer += END;
|
||||||
|
// names.insert(name);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void CodeObjectSerializer::write_end_mark(){
|
||||||
|
// buffer += ']';
|
||||||
|
// buffer += END;
|
||||||
|
// depth--;
|
||||||
|
// PK_ASSERT(depth >= 0);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// std::string CodeObjectSerializer::str(){
|
||||||
|
// PK_ASSERT(depth == 0);
|
||||||
|
// for(auto name: names){
|
||||||
|
// PK_ASSERT(StrName::is_valid(name.index));
|
||||||
|
// write_name(name);
|
||||||
|
// write_str(name.sv());
|
||||||
|
// }
|
||||||
|
// return std::move(buffer);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// CodeObjectSerializer::CodeObjectSerializer(){
|
||||||
|
// write_str(PK_VERSION);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// void CodeObjectSerializer::write_code(VM* vm, const CodeObject* co){
|
||||||
|
// buffer += '(';
|
||||||
|
// buffer += END;
|
||||||
|
// co->write(vm, *this);
|
||||||
|
// buffer += ')';
|
||||||
|
// buffer += END;
|
||||||
|
// }
|
||||||
|
|
||||||
} // namespace pkpy
|
} // namespace pkpy
|
@ -1643,10 +1643,10 @@ void add_module_dis(VM* vm){
|
|||||||
return vm->None;
|
return vm->None;
|
||||||
});
|
});
|
||||||
|
|
||||||
vm->bind_func<1>(mod, "_s", [](VM* vm, ArgsView args) {
|
// vm->bind_func<1>(mod, "_s", [](VM* vm, ArgsView args) {
|
||||||
CodeObject_ code = get_code(vm, args[0]);
|
// CodeObject_ code = get_code(vm, args[0]);
|
||||||
return VAR(code->serialize(vm));
|
// return VAR(code->serialize(vm));
|
||||||
});
|
// });
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_module_gc(VM* vm){
|
void add_module_gc(VM* vm){
|
||||||
|
22
src/vm.cpp
22
src/vm.cpp
@ -1185,17 +1185,17 @@ void Dict::_probe_1(PyObject *key, bool &ok, int &i) const{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeObjectSerializer::write_object(VM *vm, PyObject *obj){
|
// void CodeObjectSerializer::write_object(VM *vm, PyObject *obj){
|
||||||
if(is_int(obj)) write_int(_CAST(i64, obj));
|
// if(is_int(obj)) write_int(_CAST(i64, obj));
|
||||||
else if(is_float(obj)) write_float(_CAST(f64, obj));
|
// else if(is_float(obj)) write_float(_CAST(f64, obj));
|
||||||
else if(is_type(obj, vm->tp_str)) write_str(_CAST(Str&, obj));
|
// else if(is_type(obj, vm->tp_str)) write_str(_CAST(Str&, obj));
|
||||||
else if(is_type(obj, vm->tp_bool)) write_bool(_CAST(bool, obj));
|
// else if(is_type(obj, vm->tp_bool)) write_bool(_CAST(bool, obj));
|
||||||
else if(obj == vm->None) write_none();
|
// else if(obj == vm->None) write_none();
|
||||||
else if(obj == vm->Ellipsis) write_ellipsis();
|
// else if(obj == vm->Ellipsis) write_ellipsis();
|
||||||
else{
|
// else{
|
||||||
throw std::runtime_error(fmt(OBJ_NAME(vm->_t(obj)).escape(), " is not serializable"));
|
// throw std::runtime_error(fmt(OBJ_NAME(vm->_t(obj)).escape(), " is not serializable"));
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
void NativeFunc::check_size(VM* vm, ArgsView args) const{
|
void NativeFunc::check_size(VM* vm, ArgsView args) const{
|
||||||
if(args.size() != argc && argc != -1) {
|
if(args.size() != argc && argc != -1) {
|
||||||
|
@ -13,5 +13,5 @@ def f(a):
|
|||||||
def g(a):
|
def g(a):
|
||||||
return f([1,2,3] + a)
|
return f([1,2,3] + a)
|
||||||
|
|
||||||
x = _s(g)
|
# x = _s(g)
|
||||||
assert type(x) is str
|
# assert type(x) is str
|
||||||
|
Loading…
x
Reference in New Issue
Block a user