Skip to content

Commit 170c720

Browse files
committed
ovsm updates
1 parent 5d0f362 commit 170c720

File tree

5 files changed

+324
-37
lines changed

5 files changed

+324
-37
lines changed

crates/ovsm/src/compiler/ir.rs

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

crates/ovsm/src/compiler/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ impl Default for CompileOptions {
7171
compute_budget: 200_000,
7272
debug_info: false,
7373
source_map: false,
74-
sbpf_version: SbpfVersion::V1, // Default to V1 for current network compatibility
74+
sbpf_version: SbpfVersion::V1, // V1 with src=1 in CALL (matches Rust compiler)
7575
}
7676
}
7777
}

crates/ovsm/src/compiler/sbpf_codegen.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,8 +343,8 @@ impl SbpfInstruction {
343343
pub fn call_syscall(hash: u32, sbpf_version: super::SbpfVersion) -> Self {
344344
match sbpf_version {
345345
super::SbpfVersion::V1 => {
346-
// V1: Use imm=-1, actual hash will be patched via relocations
347-
Self::new(class::JMP | jmp::CALL, 0, 0, 0, -1)
346+
// V1: Use imm=-1, src=1 for syscalls (as per Rust compiler)
347+
Self::new(class::JMP | jmp::CALL, 0, 1, 0, -1)
348348
}
349349
super::SbpfVersion::V2 => {
350350
// V2: Static syscalls use src=0 and hash in imm field

src/utils/tui/app.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1064,6 +1064,20 @@ impl OsvmApp {
10641064
}
10651065
}
10661066
}
1067+
KeyCode::Char('j') => {
1068+
if self.active_tab == TabIndex::Graph {
1069+
if let Ok(mut graph) = self.wallet_graph.lock() {
1070+
graph.handle_input(GraphInput::ScrollDetailDown);
1071+
}
1072+
}
1073+
}
1074+
KeyCode::Char('k') => {
1075+
if self.active_tab == TabIndex::Graph {
1076+
if let Ok(mut graph) = self.wallet_graph.lock() {
1077+
graph.handle_input(GraphInput::ScrollDetailUp);
1078+
}
1079+
}
1080+
}
10671081
KeyCode::PageUp => {
10681082
self.log_scroll = self.log_scroll.saturating_sub(10);
10691083
}

0 commit comments

Comments
 (0)