aboutsummaryrefslogtreecommitdiff
path: root/src/compile/promotions.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-10-05 16:24:59 -0400
committerBruce Hill <bruce@bruce-hill.com>2025-10-05 16:24:59 -0400
commit9738b3454639ddf3ae46186a5c6ba671fe9a6861 (patch)
tree3b9d300b4d2cae1479c013bdb154b1eb7e16780f /src/compile/promotions.c
parent76d3008d98cf9cd6ed60a9aa66a87f854965f0ab (diff)
Add serialization and deserialization by coercion to/from [Byte]
Diffstat (limited to 'src/compile/promotions.c')
-rw-r--r--src/compile/promotions.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/compile/promotions.c b/src/compile/promotions.c
index d453b764..68b4f64c 100644
--- a/src/compile/promotions.c
+++ b/src/compile/promotions.c
@@ -25,6 +25,21 @@ bool promote(env_t *env, ast_t *ast, Text_t *code, type_t *actual, type_t *neede
type_t *more_complete = most_complete_type(actual, needed);
if (more_complete) return true;
+ // Serialization/deserialization:
+ if (type_eq(needed, Type(ListType, Type(ByteType)))) {
+ *code = Texts("generic_serialize((", compile_declaration(actual, Text("[1]")), "){", *code, "}, ",
+ compile_type_info(actual), ")");
+ return true;
+ } else if (type_eq(actual, Type(ListType, Type(ByteType)))) {
+ *code = Texts("({ ", compile_declaration(needed, Text("deserialized")),
+ ";\n"
+ "generic_deserialize(",
+ *code, ", &deserialized, ", compile_type_info(needed),
+ ");\n"
+ "deserialized; })");
+ return true;
+ }
+
// Optional promotion:
if (needed->tag == OptionalType && type_eq(actual, Match(needed, OptionalType)->type)) {
*code = promote_to_optional(actual, *code);