1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use crate::compiling::v1::assemble::prelude::*;
impl Assemble for ast::LitNumber {
fn assemble(&self, c: &mut Compiler<'_>, needs: Needs) -> CompileResult<Asm> {
use num::ToPrimitive as _;
let span = self.span();
log::trace!("LitNumber => {:?}", c.source.source(span));
if !needs.value() {
c.diagnostics.not_used(c.source_id, span, c.context());
return Ok(Asm::top(span));
}
let number = self.resolve(&c.storage, &*c.source)?;
match number {
ast::Number::Float(number) => {
c.asm.push(Inst::float(number), span);
}
ast::Number::Integer(number) => {
let n = match number.to_i64() {
Some(n) => n,
None => {
return Err(CompileError::new(
span,
ParseErrorKind::BadNumberOutOfBounds,
));
}
};
c.asm.push(Inst::integer(n), span);
}
}
Ok(Asm::top(span))
}
}