neo_solidity/
codegen_helpers.rs

1//! Code Generation Helpers
2//!
3//! Utility functions for bytecode generation.
4
5/// Encode a small integer efficiently
6pub fn encode_small_int(n: i64) -> Vec<u8> {
7    match n {
8        -1 => vec![0x0F],               // PUSHM1
9        0..=16 => vec![0x10 + n as u8], // PUSH0-PUSH16
10        _ => encode_varint(n),
11    }
12}
13
14fn encode_varint(n: i64) -> Vec<u8> {
15    let bytes = n.to_le_bytes();
16    let len = minimal_bytes(n);
17    let opcode = match len {
18        1 => 0x00, // PUSHINT8
19        2 => 0x01, // PUSHINT16
20        4 => 0x02, // PUSHINT32
21        _ => 0x03, // PUSHINT64
22    };
23    let mut result = vec![opcode];
24    result.extend_from_slice(&bytes[..len]);
25    result
26}
27
28fn minimal_bytes(n: i64) -> usize {
29    if (-128..=127).contains(&n) {
30        1
31    } else if (-32768..=32767).contains(&n) {
32        2
33    } else if (-2147483648..=2147483647).contains(&n) {
34        4
35    } else {
36        8
37    }
38}