mirror of
https://github.com/janet-lang/janet
synced 2025-02-03 02:39:09 +00:00
Update marsh.c
This commit is contained in:
parent
5464fd5173
commit
4e65eede1c
106
src/core/marsh.c
106
src/core/marsh.c
@ -133,7 +133,6 @@ static void marshal_one_def(MarshalState *st, DstFuncDef *def, int flags) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
dst_v_push(st->seen_defs, def);
|
||||
pushint(st, def->flags);
|
||||
pushint(st, def->slotcount);
|
||||
pushint(st, def->arity);
|
||||
@ -176,6 +175,9 @@ static void marshal_one_def(MarshalState *st, DstFuncDef *def, int flags) {
|
||||
pushint(st, map.column);
|
||||
}
|
||||
}
|
||||
|
||||
/* Add to lookup */
|
||||
dst_v_push(st->seen_defs, def);
|
||||
}
|
||||
|
||||
/* The main body of the marshaling function. Is the main
|
||||
@ -501,57 +503,56 @@ static const uint8_t *unmarshal_one_def(
|
||||
longjmp(st->err, UMR_INVALID_REFERENCE);
|
||||
*out = st->lookup_defs[index];
|
||||
} else {
|
||||
DstFuncDef *def = dst_gcalloc(DST_MEMORY_FUNCDEF, sizeof(DstFuncDef));
|
||||
dst_v_push(st->lookup_defs, def);
|
||||
DstFuncDef def;
|
||||
|
||||
/* Read flags and other fixed values */
|
||||
def->flags = readint(st, &data);
|
||||
def->slotcount = readint(st, &data);
|
||||
def->arity = readint(st, &data);
|
||||
def->constants_length = readint(st, &data);
|
||||
def->bytecode_length = readint(st, &data);
|
||||
def.flags = readint(st, &data);
|
||||
def.slotcount = readint(st, &data);
|
||||
def.arity = readint(st, &data);
|
||||
def.constants_length = readint(st, &data);
|
||||
def.bytecode_length = readint(st, &data);
|
||||
|
||||
def->environments_length = 0;
|
||||
def->defs_length = 0;
|
||||
def->name = NULL;
|
||||
def->source = NULL;
|
||||
if (def->flags & DST_FUNCDEF_FLAG_HASENVS)
|
||||
def->environments_length = readint(st, &data);
|
||||
if (def->flags & DST_FUNCDEF_FLAG_HASDEFS)
|
||||
def->defs_length = readint(st, &data);
|
||||
if (def->flags & DST_FUNCDEF_FLAG_HASNAME) {
|
||||
def.environments_length = 0;
|
||||
def.defs_length = 0;
|
||||
def.name = NULL;
|
||||
def.source = NULL;
|
||||
if (def.flags & DST_FUNCDEF_FLAG_HASENVS)
|
||||
def.environments_length = readint(st, &data);
|
||||
if (def.flags & DST_FUNCDEF_FLAG_HASDEFS)
|
||||
def.defs_length = readint(st, &data);
|
||||
if (def.flags & DST_FUNCDEF_FLAG_HASNAME) {
|
||||
Dst x;
|
||||
data = unmarshal_one(st, data, &x, flags + 1);
|
||||
if (!dst_checktype(x, DST_STRING)) longjmp(st->err, UMR_EXPECTED_STRING);
|
||||
def->name = dst_unwrap_string(x);
|
||||
def.name = dst_unwrap_string(x);
|
||||
}
|
||||
if (def->flags & DST_FUNCDEF_FLAG_HASSOURCE) {
|
||||
if (def.flags & DST_FUNCDEF_FLAG_HASSOURCE) {
|
||||
Dst x;
|
||||
data = unmarshal_one(st, data, &x, flags + 1);
|
||||
if (!dst_checktype(x, DST_STRING)) longjmp(st->err, UMR_EXPECTED_STRING);
|
||||
def->source = dst_unwrap_string(x);
|
||||
def.source = dst_unwrap_string(x);
|
||||
}
|
||||
|
||||
/* Unmarshal constants */
|
||||
if (def->constants_length) {
|
||||
def->constants = malloc(sizeof(Dst) * def->constants_length);
|
||||
if (!def->constants) {
|
||||
if (def.constants_length) {
|
||||
def.constants = malloc(sizeof(Dst) * def.constants_length);
|
||||
if (!def.constants) {
|
||||
DST_OUT_OF_MEMORY;
|
||||
}
|
||||
for (int32_t i = 0; i < def->constants_length; i++)
|
||||
data = unmarshal_one(st, data, def->constants + i, flags + 1);
|
||||
for (int32_t i = 0; i < def.constants_length; i++)
|
||||
data = unmarshal_one(st, data, def.constants + i, flags + 1);
|
||||
} else {
|
||||
def->constants = NULL;
|
||||
def.constants = NULL;
|
||||
}
|
||||
|
||||
/* Unmarshal bytecode */
|
||||
def->bytecode = malloc(sizeof(uint32_t) * def->bytecode_length);
|
||||
if (!def->bytecode) {
|
||||
def.bytecode = malloc(sizeof(uint32_t) * def.bytecode_length);
|
||||
if (!def.bytecode) {
|
||||
DST_OUT_OF_MEMORY;
|
||||
}
|
||||
for (int32_t i = 0; i < def->bytecode_length; i++) {
|
||||
for (int32_t i = 0; i < def.bytecode_length; i++) {
|
||||
if (data + 4 > st->end) longjmp(st->err, UMR_EOS);
|
||||
def->bytecode[i] =
|
||||
def.bytecode[i] =
|
||||
(uint32_t)(data[0]) |
|
||||
((uint32_t)(data[1]) << 8) |
|
||||
((uint32_t)(data[2]) << 16) |
|
||||
@ -560,50 +561,52 @@ static const uint8_t *unmarshal_one_def(
|
||||
}
|
||||
|
||||
/* Unmarshal environments */
|
||||
if (def->flags & DST_FUNCDEF_FLAG_HASENVS) {
|
||||
def->environments = malloc(sizeof(int32_t) * def->environments_length);
|
||||
if (!def->environments) {
|
||||
if (def.flags & DST_FUNCDEF_FLAG_HASENVS) {
|
||||
def.environments = malloc(sizeof(int32_t) * def.environments_length);
|
||||
if (!def.environments) {
|
||||
DST_OUT_OF_MEMORY;
|
||||
}
|
||||
for (int32_t i = 0; i < def->environments_length; i++) {
|
||||
def->environments[i] = readint(st, &data);
|
||||
for (int32_t i = 0; i < def.environments_length; i++) {
|
||||
def.environments[i] = readint(st, &data);
|
||||
}
|
||||
} else {
|
||||
def->environments = NULL;
|
||||
def.environments = NULL;
|
||||
}
|
||||
|
||||
/* Unmarshal sub funcdefs */
|
||||
if (def->flags & DST_FUNCDEF_FLAG_HASDEFS) {
|
||||
def->defs = malloc(sizeof(DstFuncDef *) * def->defs_length);
|
||||
if (!def->defs) {
|
||||
if (def.flags & DST_FUNCDEF_FLAG_HASDEFS) {
|
||||
def.defs = malloc(sizeof(DstFuncDef *) * def.defs_length);
|
||||
if (!def.defs) {
|
||||
DST_OUT_OF_MEMORY;
|
||||
}
|
||||
for (int32_t i = 0; i < def->defs_length; i++) {
|
||||
data = unmarshal_one_def(st, data, def->defs + i, flags + 1);
|
||||
for (int32_t i = 0; i < def.defs_length; i++) {
|
||||
data = unmarshal_one_def(st, data, def.defs + i, flags + 1);
|
||||
}
|
||||
} else {
|
||||
def->defs = NULL;
|
||||
def.defs = NULL;
|
||||
}
|
||||
|
||||
/* Unmarshal source maps if needed */
|
||||
if (def->flags & DST_FUNCDEF_FLAG_HASSOURCEMAP) {
|
||||
def->sourcemap = malloc(sizeof(DstSourceMapping) * def->bytecode_length);
|
||||
if (!def->sourcemap) {
|
||||
if (def.flags & DST_FUNCDEF_FLAG_HASSOURCEMAP) {
|
||||
def.sourcemap = malloc(sizeof(DstSourceMapping) * def.bytecode_length);
|
||||
if (!def.sourcemap) {
|
||||
DST_OUT_OF_MEMORY;
|
||||
}
|
||||
for (int32_t i = 0; i < def->bytecode_length; i++) {
|
||||
def->sourcemap[i].line = readint(st, &data);
|
||||
def->sourcemap[i].column = readint(st, &data);
|
||||
for (int32_t i = 0; i < def.bytecode_length; i++) {
|
||||
def.sourcemap[i].line = readint(st, &data);
|
||||
def.sourcemap[i].column = readint(st, &data);
|
||||
}
|
||||
} else {
|
||||
def->sourcemap = NULL;
|
||||
def.sourcemap = NULL;
|
||||
}
|
||||
|
||||
/* Validate */
|
||||
if (dst_verify(def)) longjmp(st->err, UMR_INVALID_BYTECODE);
|
||||
if (dst_verify(&def)) longjmp(st->err, UMR_INVALID_BYTECODE);
|
||||
|
||||
/* Set def */
|
||||
*out = def;
|
||||
*out = dst_gcalloc(DST_MEMORY_FUNCDEF, sizeof(DstFuncDef));
|
||||
dst_v_push(st->lookup_defs, *out);
|
||||
memcpy(*out, &def, sizeof(def));
|
||||
}
|
||||
return data;
|
||||
}
|
||||
@ -701,6 +704,7 @@ static const uint8_t *unmarshal_one(
|
||||
data = unmarshal_one_def(st, data + 1, &def, flags + 1);
|
||||
func = dst_gcalloc(DST_MEMORY_FUNCTION, sizeof(DstFunction) +
|
||||
def->environments_length * sizeof(DstFuncEnv));
|
||||
func->def = def;
|
||||
*out = dst_wrap_function(func);
|
||||
dst_array_push(&st->lookup, *out);
|
||||
for (int32_t i = 0; i < def->environments_length; i++) {
|
||||
|
Loading…
Reference in New Issue
Block a user