|
@@ -372,9 +372,22 @@ static bool pkl__write_object(PickleObject* buf, py_TValue* obj) {
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
if(ti->is_python) {
|
|
if(ti->is_python) {
|
|
|
|
|
+ NameDict* dict = PyObject__dict(obj->_obj);
|
|
|
|
|
+ for(int i = dict->length - 1; i >= 0; i--) {
|
|
|
|
|
+ NameDict_KV* kv = c11__at(NameDict_KV, dict, i);
|
|
|
|
|
+ if(!pkl__write_object(buf, &kv->value)) return false;
|
|
|
|
|
+ }
|
|
|
pkl__emit_op(buf, PKL_OBJECT);
|
|
pkl__emit_op(buf, PKL_OBJECT);
|
|
|
pkl__emit_int(buf, obj->type);
|
|
pkl__emit_int(buf, obj->type);
|
|
|
buf->used_types[obj->type] = true;
|
|
buf->used_types[obj->type] = true;
|
|
|
|
|
+ pkl__emit_int(buf, dict->length);
|
|
|
|
|
+ for(int i = 0; i < dict->length; i++) {
|
|
|
|
|
+ NameDict_KV* kv = c11__at(NameDict_KV, dict, i);
|
|
|
|
|
+ c11_sv field = py_name2sv(kv->key);
|
|
|
|
|
+ // include '\0'
|
|
|
|
|
+ PickleObject__write_bytes(buf, field.data, field.size + 1);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// store memo
|
|
// store memo
|
|
|
pkl__store_memo(buf, obj->_obj);
|
|
pkl__store_memo(buf, obj->_obj);
|
|
|
return true;
|
|
return true;
|
|
@@ -662,7 +675,16 @@ bool py_pickle_loads_body(const unsigned char* p, int memo_length, c11_smallmap_
|
|
|
case PKL_OBJECT: {
|
|
case PKL_OBJECT: {
|
|
|
py_Type type = (py_Type)pkl__read_int(&p);
|
|
py_Type type = (py_Type)pkl__read_int(&p);
|
|
|
type = pkl__fix_type(type, type_mapping);
|
|
type = pkl__fix_type(type, type_mapping);
|
|
|
- if(!py_tpcall(type, 0, NULL)) return false;
|
|
|
|
|
|
|
+ py_newobject(py_retval(), type, -1, 0);
|
|
|
|
|
+ NameDict* dict = PyObject__dict(py_retval()->_obj);
|
|
|
|
|
+ int dict_length = pkl__read_int(&p);
|
|
|
|
|
+ for(int i = 0; i < dict_length; i++) {
|
|
|
|
|
+ py_StackRef value = py_peek(-1);
|
|
|
|
|
+ c11_sv field = {(const char*)p, strlen((const char*)p)};
|
|
|
|
|
+ NameDict__set(dict, py_namev(field), *value);
|
|
|
|
|
+ py_pop();
|
|
|
|
|
+ p += field.size + 1;
|
|
|
|
|
+ }
|
|
|
py_push(py_retval());
|
|
py_push(py_retval());
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|