|
1 | 1 | use pd_vm_nostd::{Value as EmbeddedValue, WireError, decode_program}; |
2 | | -use vm::{HostImport, OpCode, Program, Value, ValueType, compile_source, encode_program}; |
| 2 | +use vm::compiler::TypeSchema; |
| 3 | +use vm::{ |
| 4 | + HostImport, OpCode, Program, ReplLocalBinding, Value, ValueType, compile_source, |
| 5 | + compile_source_for_repl_with_locals, encode_program, |
| 6 | +}; |
3 | 7 |
|
4 | 8 | fn encoded_scalar_program() -> Vec<u8> { |
5 | 9 | let mut program = Program::new( |
@@ -57,6 +61,31 @@ fn embedded_decoder_accepts_compiler_type_and_debug_metadata() { |
57 | 61 | assert_eq!(program.local_count(), compiled.locals); |
58 | 62 | } |
59 | 63 |
|
| 64 | +#[test] |
| 65 | +fn embedded_decoder_preserves_metadata_only_repl_locals() { |
| 66 | + let compiled = compile_source_for_repl_with_locals( |
| 67 | + "print(42);", |
| 68 | + &[ReplLocalBinding { |
| 69 | + name: "saved".to_string(), |
| 70 | + mutable: false, |
| 71 | + schema: Some(TypeSchema::Int), |
| 72 | + optional: false, |
| 73 | + }], |
| 74 | + ) |
| 75 | + .expect("REPL source should compile"); |
| 76 | + let bytes = encode_program( |
| 77 | + &compiled |
| 78 | + .compiled |
| 79 | + .program |
| 80 | + .with_local_count(compiled.compiled.locals), |
| 81 | + ) |
| 82 | + .expect("REPL output should encode"); |
| 83 | + |
| 84 | + let program = decode_program(&bytes).expect("embedded decoder should accept REPL VMBC"); |
| 85 | + assert_eq!(program.local_count(), compiled.compiled.locals); |
| 86 | + assert_eq!(program.local_count(), 1); |
| 87 | +} |
| 88 | + |
60 | 89 | #[test] |
61 | 90 | fn embedded_decoder_rejects_trailing_bytes() { |
62 | 91 | let mut bytes = encoded_scalar_program(); |
|
0 commit comments