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
|
// 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
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user