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
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

View File

@ -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;
}

View File

@ -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);