瀏覽代碼

disable code serialization impl

blueloveTH 2 年之前
父節點
當前提交
0157025097
共有 5 個文件被更改,包括 201 次插入200 次删除
  1. 39 39
      include/pocketpy/codeobject.h
  2. 145 144
      src/codeobject.cpp
  3. 4 4
      src/pocketpy.cpp
  4. 11 11
      src/vm.cpp
  5. 2 2
      tests/81_frontend.py

+ 39 - 39
include/pocketpy/codeobject.h

@@ -57,43 +57,43 @@ struct FuncDecl;
 using CodeObject_ = std::shared_ptr<CodeObject>;
 using FuncDecl_ = std::shared_ptr<FuncDecl>;
 
-struct CodeObjectSerializer{
-    std::string buffer;
-    int depth = 0;
-
-    std::set<StrName> names;
-
-    static const char END = '\n';
-
-    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();
-
-    template<typename T>
-    void write_bytes(T v){
-        static_assert(std::is_trivially_copyable<T>::value);
-        buffer += 'x';
-        char* p = (char*)&v;
-        for(int i=0; i<sizeof(T); i++){
-            char c = p[i];
-            buffer += "0123456789abcdef"[(c >> 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();
-};
+// struct CodeObjectSerializer{
+//     std::string buffer;
+//     int depth = 0;
+
+//     std::set<StrName> names;
+
+//     static const char END = '\n';
+
+//     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();
+
+//     template<typename T>
+//     void write_bytes(T v){
+//         static_assert(std::is_trivially_copyable<T>::value);
+//         buffer += 'x';
+//         char* p = (char*)&v;
+//         for(int i=0; i<sizeof(T); i++){
+//             char c = p[i];
+//             buffer += "0123456789abcdef"[(c >> 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();
+// };
 
 
 struct CodeObject {
@@ -117,8 +117,8 @@ struct CodeObject {
 
     CodeObject(std::shared_ptr<SourceData> 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 {

+ 145 - 144
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

+ 4 - 4
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){

+ 11 - 11
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) {

+ 2 - 2
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
+# x = _s(g)
+# assert type(x) is str