From 00c44a9a43f19e85bbe74cda62a6f685b7cf881a Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Mon, 5 Jan 2026 18:48:18 +0800 Subject: [PATCH] patch filename --- include/pocketpy/objects/codeobject.h | 2 +- src/objects/codeobject_ser.c | 23 +++++++++-------------- src/public/ModuleSystem.c | 3 ++- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/include/pocketpy/objects/codeobject.h b/include/pocketpy/objects/codeobject.h index 8eda0c1d..a6fd24c3 100644 --- a/include/pocketpy/objects/codeobject.h +++ b/include/pocketpy/objects/codeobject.h @@ -95,7 +95,7 @@ void CodeObject__gc_mark(const CodeObject* self, c11_vector* p_stack); // Serialization void* CodeObject__dumps(const CodeObject* co, int* size); -char* CodeObject__loads(const void* data, int size, CodeObject* out); +char* CodeObject__loads(const void* data, int size, const char* filename, CodeObject* out); typedef struct FuncDeclKwArg { int index; // index in co->varnames diff --git a/src/objects/codeobject_ser.c b/src/objects/codeobject_ser.c index ef95d129..4dcb29e4 100644 --- a/src/objects/codeobject_ser.c +++ b/src/objects/codeobject_ser.c @@ -16,7 +16,7 @@ static FuncDecl_ FuncDecl__deserialize(c11_deserializer* d, SourceData_ embedded static void CodeObject__serialize(c11_serializer* s, const CodeObject* co, const struct SourceData* parent_src); -static CodeObject CodeObject__deserialize(c11_deserializer* d, SourceData_ embedded_src); +static CodeObject CodeObject__deserialize(c11_deserializer* d, const char* filename, SourceData_ embedded_src); // Serialize a py_TValue constant // Supported types: None, int, float, bool, str, bytes, tuple, Ellipsis @@ -106,11 +106,7 @@ static void CodeObject__serialize(c11_serializer* s, const CodeObject* co, const struct SourceData* parent_src) { // SourceData - if(!parent_src) { - c11_serializer__write_i8(s, (int8_t)co->src->mode); - c11_serializer__write_i8(s, co->src->is_dynamic ? 1 : 0); - c11_serializer__write_cstr(s, co->src->filename->data); - } else { + if(parent_src) { c11__rtassert(co->src == parent_src); } @@ -169,19 +165,18 @@ static void CodeObject__serialize(c11_serializer* s, } // Deserialize CodeObject (initialize co before calling) -static CodeObject CodeObject__deserialize(c11_deserializer* d, SourceData_ embedded_src) { +static CodeObject CodeObject__deserialize(c11_deserializer* d, const char* filename, SourceData_ embedded_src) { CodeObject co; // SourceData SourceData_ src; if(embedded_src != NULL) { + c11__rtassert(filename == NULL); src = embedded_src; PK_INCREF(src); } else { - enum py_CompileMode mode = (enum py_CompileMode)c11_deserializer__read_i8(d); - bool is_dynamic = c11_deserializer__read_i8(d) != 0; - const char* filename = c11_deserializer__read_cstr(d); - src = SourceData__rcnew(NULL, filename, mode, is_dynamic); + c11__rtassert(filename != NULL); + src = SourceData__rcnew(NULL, filename, EXEC_MODE, false); } // name @@ -299,7 +294,7 @@ static FuncDecl_ FuncDecl__deserialize(c11_deserializer* d, SourceData_ embedded c11_smallmap_n2d__ctor(&self->kw_to_index); // CodeObject (embedded) - self->code = CodeObject__deserialize(d, embedded_src); + self->code = CodeObject__deserialize(d, NULL, embedded_src); // args int args_len = c11_deserializer__read_i32(d); @@ -349,7 +344,7 @@ void* CodeObject__dumps(const CodeObject* co, int* size) { // Public API: Deserialize CodeObject from bytes // Returns error message or NULL on success -char* CodeObject__loads(const void* data, int size, CodeObject* out) { +char* CodeObject__loads(const void* data, int size, const char* filename, CodeObject* out) { c11_deserializer d; c11_deserializer__ctor(&d, data, size); @@ -362,7 +357,7 @@ char* CodeObject__loads(const void* data, int size, CodeObject* out) { return error_msg; } - *out = CodeObject__deserialize(&d, NULL); + *out = CodeObject__deserialize(&d, filename, NULL); c11_deserializer__dtor(&d); return NULL; } diff --git a/src/public/ModuleSystem.c b/src/public/ModuleSystem.c index f59b41ae..c641e68c 100644 --- a/src/public/ModuleSystem.c +++ b/src/public/ModuleSystem.c @@ -187,9 +187,10 @@ __SUCCESS: bool ok; if(is_pyc) { CodeObject co; - char* err = CodeObject__loads(data, data_size, &co); + char* err = CodeObject__loads(data, data_size, filename->data, &co); if(err == NULL) { c11__rtassert(co.src->mode == EXEC_MODE); + c11__rtassert(co.src->is_dynamic == false); ok = pk_exec(&co, mod); } else { RuntimeError("failed to load %s: %s", filename->data, err);