Skip to content

Commit 2668084

Browse files
committed
fix: resolve image_save handle passing and expression type inference
- runtime2/interpreter.rs: Use Type::Any for Call and Variable expressions instead of defaulting to Unit, allowing proper type inference in lowering - zrtl_image/src/lib.rs: Fix signatures for image_load and image_save to use concrete types (i64, u64) instead of dynamic boxing The root cause was that Call expressions were assigned Type::Unit by default, which caused function return values to be ignored. Now they use Type::Any which triggers proper type lookup during lowering.
1 parent d5dafd5 commit 2668084

2 files changed

Lines changed: 11 additions & 5 deletions

File tree

crates/zyn_peg/src/runtime2/interpreter.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,11 @@ impl<'g> GrammarInterpreter<'g> {
366366
TypedExpression::Literal(TypedLiteral::Float(_)) => Type::Primitive(PrimitiveType::F32),
367367
TypedExpression::Literal(TypedLiteral::String(_)) => Type::Primitive(PrimitiveType::String),
368368
TypedExpression::Literal(TypedLiteral::Bool(_)) => Type::Primitive(PrimitiveType::Bool),
369-
_ => Type::Primitive(PrimitiveType::Unit), // Default, would need type inference
369+
// Call and Variable expressions need type inference from callee/declaration
370+
// Use Type::Any to signal that lowering should infer the type
371+
TypedExpression::Call(_) => Type::Any,
372+
TypedExpression::Variable(_) => Type::Any,
373+
_ => Type::Primitive(PrimitiveType::Unit),
370374
};
371375

372376
Ok(ParsedValue::Expression(Box::new(typed_node(expr, ty, span))))

plugins/zrtl_image/src/lib.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -693,15 +693,17 @@ zrtl_plugin! {
693693
// Loading/Saving (with signatures)
694694
// Functions with opaque params (StringPtr/ArrayPtr) use dynamic boxing
695695
// image_load(path: StringPtr) -> u64 (handle)
696-
("$Image$load", image_load, dynamic(1) -> void),
696+
// StringPtr is an i64 (pointer)
697+
("$Image$load", image_load, (i64) -> u64),
697698
// image_load_bytes(data: ArrayPtr) -> u64
698699
("$Image$load_bytes", image_load_bytes, dynamic(1) -> void),
699700
// image_load_bytes_format(data: ArrayPtr, format: i32) -> u64
700701
("$Image$load_bytes_format", image_load_bytes_format, dynamic(2) -> void),
701-
// image_save(handle: u64, path: StringPtr) -> void
702-
("$Image$save", image_save, dynamic(2) -> void),
702+
// image_save(handle: u64, path: StringPtr) -> i32 (returns 0 on success, -1 on error)
703+
// Use i64 for both since StringPtr is a pointer
704+
("$Image$save", image_save, (u64, i64) -> i32),
703705
// image_save_format(handle: u64, path: StringPtr, format: i32) -> i32
704-
("$Image$save_format", image_save_format, dynamic(3) -> void),
706+
("$Image$save_format", image_save_format, (u64, i64, i32) -> i32),
705707
// image_encode(handle: u64, format: i32) -> ArrayPtr
706708
("$Image$encode", image_encode, dynamic(2) -> dynamic),
707709
// image_encode_png(handle: u64) -> ArrayPtr

0 commit comments

Comments
 (0)