@@ -518,13 +518,48 @@ impl IrGenerator {
518518 }
519519
520520 // Handle (sol_log_ msg) - shorthand for logging syscall
521- if ( name == "sol_log_" || name == "sol_log_64_" ) && args. len ( ) == 1 {
522- // Get message register
523- let msg_reg = self . generate_expr ( & args[ 0 ] . value ) ?
524- . ok_or_else ( || Error :: runtime ( "log message has no result" ) ) ?;
521+ if name == "sol_log_" && args. len ( ) == 1 {
522+ // Check if the argument is a string literal
523+ if let Expression :: StringLiteral ( ref s) = args[ 0 ] . value {
524+ // Get message pointer register
525+ let msg_reg = self . generate_expr ( & args[ 0 ] . value ) ?
526+ . ok_or_else ( || Error :: runtime ( "log message has no result" ) ) ?;
527+
528+ // sol_log_ requires: R1 = pointer, R2 = length
529+ // Generate length register
530+ let len_reg = self . alloc_reg ( ) ;
531+ self . emit ( IrInstruction :: ConstI64 ( len_reg, s. len ( ) as i64 ) ) ;
532+
533+ let dst = self . alloc_reg ( ) ;
534+ self . emit ( IrInstruction :: Syscall ( Some ( dst) , name. clone ( ) , vec ! [ msg_reg, len_reg] ) ) ;
535+ return Ok ( Some ( dst) ) ;
536+ } else {
537+ return Err ( Error :: runtime ( "sol_log_ requires a string literal argument" ) ) ;
538+ }
539+ }
540+
541+ // Handle (sol_log_64_ ...) - log up to 5 numeric values
542+ if name == "sol_log_64_" && args. len ( ) >= 1 && args. len ( ) <= 5 {
543+ let mut arg_regs = Vec :: new ( ) ;
544+ for arg in args {
545+ let reg = self . generate_expr ( & arg. value ) ?
546+ . ok_or_else ( || Error :: runtime ( "log argument has no result" ) ) ?;
547+ arg_regs. push ( reg) ;
548+ }
549+
550+ let dst = self . alloc_reg ( ) ;
551+ self . emit ( IrInstruction :: Syscall ( Some ( dst) , name. clone ( ) , arg_regs) ) ;
552+ return Ok ( Some ( dst) ) ;
553+ }
554+
555+ // Handle (println msg) - no-op for local testing (just evaluate and discard)
556+ if name == "println" && args. len ( ) == 1 {
557+ // Evaluate the argument (so side effects happen) but discard the result
558+ let _result = self . generate_expr ( & args[ 0 ] . value ) ?;
525559
560+ // Return success (0)
526561 let dst = self . alloc_reg ( ) ;
527- self . emit ( IrInstruction :: Syscall ( Some ( dst) , name . clone ( ) , vec ! [ msg_reg ] ) ) ;
562+ self . emit ( IrInstruction :: ConstI64 ( dst, 0 ) ) ;
528563 return Ok ( Some ( dst) ) ;
529564 }
530565
0 commit comments