diff --git a/nac3artiq/src/codegen.rs b/nac3artiq/src/codegen.rs index b9ef9730..ee7f39dd 100644 --- a/nac3artiq/src/codegen.rs +++ b/nac3artiq/src/codegen.rs @@ -24,6 +24,7 @@ use pyo3::{ use crate::{symbol_resolver::InnerResolver, timeline::TimeFns}; +use inkwell::values::PointerValue; use itertools::Itertools; use nac3core::codegen::classes::{ListValue, NDArrayValue, RangeValue, UntypedArrayLikeAccessor}; use nac3core::codegen::expr::destructure_range; @@ -763,7 +764,11 @@ fn polymorphic_print<'ctx>( let fmt = ctx.gen_string(generator, fmt); ctx.builder - .build_call(print_fn, &once(fmt).chain(args).map(|arg| arg.into()).collect_vec(), "") + .build_call( + print_fn, + &once(fmt).chain(args).map(BasicValueEnum::into).collect_vec(), + "", + ) .unwrap(); }; @@ -1081,7 +1086,7 @@ pub fn call_core_log_impl<'ctx>( ) -> Result<(), String> { let (arg_ty, arg_val) = arg; - polymorphic_print(ctx, generator, &[(arg_ty, arg_val.into())], "", None, false, false); + polymorphic_print(ctx, generator, &[(arg_ty, arg_val.into())], "", None, false, false)?; Ok(()) } @@ -1090,15 +1095,26 @@ pub fn call_core_log_impl<'ctx>( pub fn call_rtio_log_impl<'ctx>( ctx: &mut CodeGenContext<'ctx, '_>, generator: &mut dyn CodeGenerator, + channel: PointerValue<'ctx>, arg: (Type, BasicValueEnum<'ctx>), ) -> Result<(), String> { let (arg_ty, arg_val) = arg; - polymorphic_print(ctx, generator, &[(arg_ty, arg_val.into())], "", None, false, true); + polymorphic_print( + ctx, + generator, + &[(ctx.primitives.str, channel.into())], + " ", + Some("\x1E"), + false, + true, + )?; + polymorphic_print(ctx, generator, &[(arg_ty, arg_val.into())], " ", Some("\x1D"), false, true)?; Ok(()) } +/// Generates a call to `core_log`. pub fn gen_core_log<'ctx>( ctx: &mut CodeGenContext<'ctx, '_>, obj: &Option<(Type, ValueEnum<'ctx>)>, @@ -1115,6 +1131,7 @@ pub fn gen_core_log<'ctx>( call_core_log_impl(ctx, generator, (value_ty, value_arg)) } +/// Generates a call to `rtio_log`. pub fn gen_rtio_log<'ctx>( ctx: &mut CodeGenContext<'ctx, '_>, obj: &Option<(Type, ValueEnum<'ctx>)>, @@ -1125,8 +1142,12 @@ pub fn gen_rtio_log<'ctx>( assert!(obj.is_none()); assert_eq!(args.len(), 1); - let value_ty = fun.0.args[0].ty; - let value_arg = args[0].1.clone().to_basic_value_enum(ctx, generator, value_ty)?; + let channel_ty = fun.0.args[0].ty; + assert!(ctx.unifier.unioned(channel_ty, ctx.primitives.str)); + let channel_arg = + args[0].1.clone().to_basic_value_enum(ctx, generator, channel_ty)?.into_pointer_value(); + let value_ty = fun.0.args[1].ty; + let value_arg = args[1].1.clone().to_basic_value_enum(ctx, generator, value_ty)?; - call_rtio_log_impl(ctx, generator, (value_ty, value_arg)) + call_rtio_log_impl(ctx, generator, channel_arg, (value_ty, value_arg)) } diff --git a/nac3artiq/src/lib.rs b/nac3artiq/src/lib.rs index db2c3a6e..3b4df2e1 100644 --- a/nac3artiq/src/lib.rs +++ b/nac3artiq/src/lib.rs @@ -909,7 +909,7 @@ impl Nac3 { "core_log".into(), FunSignature { args: vec![FuncArg { - name: "obj".into(), + name: "arg".into(), ty: arg_ty.ty, default_value: None, is_vararg: false, @@ -930,12 +930,20 @@ impl Nac3 { ( "rtio_log".into(), FunSignature { - args: vec![FuncArg { - name: "obj".into(), - ty: arg_ty.ty, - default_value: None, - is_vararg: false, - }], + args: vec![ + FuncArg { + name: "channel".into(), + ty: primitive.str, + default_value: None, + is_vararg: false, + }, + FuncArg { + name: "arg".into(), + ty: arg_ty.ty, + default_value: None, + is_vararg: false, + }, + ], ret: primitive.none, vars: into_var_map([arg_ty]), },