patch filename

This commit is contained in:
blueloveTH 2026-01-05 18:48:18 +08:00
parent ba8c4aa76f
commit 00c44a9a43
3 changed files with 12 additions and 16 deletions

View File

@ -95,7 +95,7 @@ void CodeObject__gc_mark(const CodeObject* self, c11_vector* p_stack);
// Serialization // Serialization
void* CodeObject__dumps(const CodeObject* co, int* size); 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 { typedef struct FuncDeclKwArg {
int index; // index in co->varnames int index; // index in co->varnames

View File

@ -16,7 +16,7 @@ static FuncDecl_ FuncDecl__deserialize(c11_deserializer* d, SourceData_ embedded
static void CodeObject__serialize(c11_serializer* s, static void CodeObject__serialize(c11_serializer* s,
const CodeObject* co, const CodeObject* co,
const struct SourceData* parent_src); 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 // Serialize a py_TValue constant
// Supported types: None, int, float, bool, str, bytes, tuple, Ellipsis // 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 CodeObject* co,
const struct SourceData* parent_src) { const struct SourceData* parent_src) {
// SourceData // SourceData
if(!parent_src) { 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 {
c11__rtassert(co->src == 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) // 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; CodeObject co;
// SourceData // SourceData
SourceData_ src; SourceData_ src;
if(embedded_src != NULL) { if(embedded_src != NULL) {
c11__rtassert(filename == NULL);
src = embedded_src; src = embedded_src;
PK_INCREF(src); PK_INCREF(src);
} else { } else {
enum py_CompileMode mode = (enum py_CompileMode)c11_deserializer__read_i8(d); c11__rtassert(filename != NULL);
bool is_dynamic = c11_deserializer__read_i8(d) != 0; src = SourceData__rcnew(NULL, filename, EXEC_MODE, false);
const char* filename = c11_deserializer__read_cstr(d);
src = SourceData__rcnew(NULL, filename, mode, is_dynamic);
} }
// name // name
@ -299,7 +294,7 @@ static FuncDecl_ FuncDecl__deserialize(c11_deserializer* d, SourceData_ embedded
c11_smallmap_n2d__ctor(&self->kw_to_index); c11_smallmap_n2d__ctor(&self->kw_to_index);
// CodeObject (embedded) // CodeObject (embedded)
self->code = CodeObject__deserialize(d, embedded_src); self->code = CodeObject__deserialize(d, NULL, embedded_src);
// args // args
int args_len = c11_deserializer__read_i32(d); 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 // Public API: Deserialize CodeObject from bytes
// Returns error message or NULL on success // 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 d;
c11_deserializer__ctor(&d, data, size); c11_deserializer__ctor(&d, data, size);
@ -362,7 +357,7 @@ char* CodeObject__loads(const void* data, int size, CodeObject* out) {
return error_msg; return error_msg;
} }
*out = CodeObject__deserialize(&d, NULL); *out = CodeObject__deserialize(&d, filename, NULL);
c11_deserializer__dtor(&d); c11_deserializer__dtor(&d);
return NULL; return NULL;
} }

View File

@ -187,9 +187,10 @@ __SUCCESS:
bool ok; bool ok;
if(is_pyc) { if(is_pyc) {
CodeObject co; CodeObject co;
char* err = CodeObject__loads(data, data_size, &co); char* err = CodeObject__loads(data, data_size, filename->data, &co);
if(err == NULL) { if(err == NULL) {
c11__rtassert(co.src->mode == EXEC_MODE); c11__rtassert(co.src->mode == EXEC_MODE);
c11__rtassert(co.src->is_dynamic == false);
ok = pk_exec(&co, mod); ok = pk_exec(&co, mod);
} else { } else {
RuntimeError("failed to load %s: %s", filename->data, err); RuntimeError("failed to load %s: %s", filename->data, err);