From 0157025097f5bd284dbab1dfbd58555092b13c1b Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Sat, 14 Oct 2023 15:25:07 +0800 Subject: [PATCH] disable code serialization impl --- include/pocketpy/codeobject.h | 66 ++++---- src/codeobject.cpp | 289 +++++++++++++++++----------------- src/pocketpy.cpp | 8 +- src/vm.cpp | 22 +-- tests/81_frontend.py | 4 +- 5 files changed, 195 insertions(+), 194 deletions(-) diff --git a/include/pocketpy/codeobject.h b/include/pocketpy/codeobject.h index 1505fc46..4a131cc8 100644 --- a/include/pocketpy/codeobject.h +++ b/include/pocketpy/codeobject.h @@ -57,43 +57,43 @@ struct FuncDecl; using CodeObject_ = std::shared_ptr; using FuncDecl_ = std::shared_ptr; -struct CodeObjectSerializer{ - std::string buffer; - int depth = 0; +// struct CodeObjectSerializer{ +// std::string buffer; +// int depth = 0; - std::set names; +// std::set names; - static const char END = '\n'; +// static const char END = '\n'; - CodeObjectSerializer(); +// CodeObjectSerializer(); - void write_int(i64 v); - void write_float(f64 v); - void write_str(const Str& v); - void write_none(); - void write_ellipsis(); - void write_bool(bool v); - void write_begin_mark(); - void write_name(StrName name); - void write_end_mark(); +// void write_int(i64 v); +// void write_float(f64 v); +// void write_str(const Str& v); +// void write_none(); +// void write_ellipsis(); +// void write_bool(bool v); +// void write_begin_mark(); +// void write_name(StrName name); +// void write_end_mark(); - template - void write_bytes(T v){ - static_assert(std::is_trivially_copyable::value); - buffer += 'x'; - char* p = (char*)&v; - for(int i=0; i> 4) & 0xf]; - buffer += "0123456789abcdef"[c & 0xf]; - } - buffer += END; - } +// template +// void write_bytes(T v){ +// static_assert(std::is_trivially_copyable::value); +// buffer += 'x'; +// char* p = (char*)&v; +// for(int i=0; i> 4) & 0xf]; +// buffer += "0123456789abcdef"[c & 0xf]; +// } +// buffer += END; +// } - void write_object(VM* vm, PyObject* obj); - void write_code(VM* vm, const CodeObject* co); - std::string str(); -}; +// void write_object(VM* vm, PyObject* obj); +// void write_code(VM* vm, const CodeObject* co); +// std::string str(); +// }; struct CodeObject { @@ -117,8 +117,8 @@ struct CodeObject { CodeObject(std::shared_ptr src, const Str& name); void _gc_mark() const; - void write(VM* vm, CodeObjectSerializer& ss) const; - Str serialize(VM* vm) const; + // void write(VM* vm, CodeObjectSerializer& ss) const; + // Str serialize(VM* vm) const; }; struct FuncDecl { diff --git a/src/codeobject.cpp b/src/codeobject.cpp index d40b8c7d..90d937d4 100644 --- a/src/codeobject.cpp +++ b/src/codeobject.cpp @@ -10,150 +10,6 @@ namespace pkpy{ 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){ this->f = f; this->argc = argc; @@ -166,4 +22,149 @@ void CodeObjectSerializer::write_code(VM* vm, const CodeObject* co){ 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 \ No newline at end of file diff --git a/src/pocketpy.cpp b/src/pocketpy.cpp index c49cbb2b..def7aff0 100644 --- a/src/pocketpy.cpp +++ b/src/pocketpy.cpp @@ -1643,10 +1643,10 @@ void add_module_dis(VM* vm){ return vm->None; }); - vm->bind_func<1>(mod, "_s", [](VM* vm, ArgsView args) { - CodeObject_ code = get_code(vm, args[0]); - return VAR(code->serialize(vm)); - }); + // vm->bind_func<1>(mod, "_s", [](VM* vm, ArgsView args) { + // CodeObject_ code = get_code(vm, args[0]); + // return VAR(code->serialize(vm)); + // }); } void add_module_gc(VM* vm){ diff --git a/src/vm.cpp b/src/vm.cpp index 2fe919f8..5effe577 100644 --- a/src/vm.cpp +++ b/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){ - if(is_int(obj)) write_int(_CAST(i64, 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_bool)) write_bool(_CAST(bool, obj)); - else if(obj == vm->None) write_none(); - else if(obj == vm->Ellipsis) write_ellipsis(); - else{ - throw std::runtime_error(fmt(OBJ_NAME(vm->_t(obj)).escape(), " is not serializable")); - } -} +// void CodeObjectSerializer::write_object(VM *vm, PyObject *obj){ +// if(is_int(obj)) write_int(_CAST(i64, 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_bool)) write_bool(_CAST(bool, obj)); +// else if(obj == vm->None) write_none(); +// else if(obj == vm->Ellipsis) write_ellipsis(); +// else{ +// throw std::runtime_error(fmt(OBJ_NAME(vm->_t(obj)).escape(), " is not serializable")); +// } +// } void NativeFunc::check_size(VM* vm, ArgsView args) const{ if(args.size() != argc && argc != -1) { diff --git a/tests/81_frontend.py b/tests/81_frontend.py index b0c418c8..2fe2d149 100644 --- a/tests/81_frontend.py +++ b/tests/81_frontend.py @@ -13,5 +13,5 @@ def f(a): def g(a): return f([1,2,3] + a) -x = _s(g) -assert type(x) is str \ No newline at end of file +# x = _s(g) +# assert type(x) is str