disable code serialization impl

This commit is contained in:
blueloveTH 2023-10-14 15:25:07 +08:00
parent 02798c5b00
commit 0157025097
5 changed files with 195 additions and 194 deletions

View File

@ -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 {

View File

@ -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

View File

@ -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){

View File

@ -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) {

View File

@ -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