1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use crate::ast;
use crate::compiler::{Compiler, Needs};
use crate::error::CompileResult;
use crate::traits::{Compile, Resolve as _};
use runestick::Inst;

/// Compile a literal string `b"Hello World"`.
impl Compile<(&ast::LitByteStr, Needs)> for Compiler<'_, '_> {
    fn compile(&mut self, (lit_byte_str, needs): (&ast::LitByteStr, Needs)) -> CompileResult<()> {
        let span = lit_byte_str.span();
        log::trace!("LitByteStr => {:?}", self.source.source(span)?);

        // NB: Elide the entire literal if it's not needed.
        if !needs.value() {
            self.warnings.not_used(span, self.context());
            return Ok(());
        }

        let bytes = lit_byte_str.resolve(self.source)?;
        let slot = self.unit.borrow_mut().new_static_bytes(&*bytes)?;
        self.asm.push(Inst::Bytes { slot }, span);
        Ok(())
    }
}