mirror of
https://github.com/pocketpy/pocketpy
synced 2026-02-04 06:30:17 +00:00
patch filename
This commit is contained in:
parent
ba8c4aa76f
commit
00c44a9a43
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user