1
0
forked from M-Labs/nac3

support numerical constants

This commit is contained in:
Sebastien Bourdeauducq 2020-03-29 15:13:08 +08:00
parent a43c7b8d4f
commit 37f7140bb8
3 changed files with 27 additions and 5 deletions

2
Cargo.lock generated
View File

@ -380,6 +380,8 @@ name = "nac3"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"inkwell", "inkwell",
"num-bigint",
"num-traits",
"rustpython-parser", "rustpython-parser",
] ]

View File

@ -5,5 +5,7 @@ authors = ["Sebastien Bourdeauducq <sb@m-labs.hk>"]
edition = "2018" edition = "2018"
[dependencies] [dependencies]
num-bigint = "0.2"
num-traits = "0.2"
inkwell = { git = "https://github.com/TheDan64/inkwell", branch = "llvm8-0" } inkwell = { git = "https://github.com/TheDan64/inkwell", branch = "llvm8-0" }
rustpython-parser = { git = "https://github.com/RustPython/RustPython", branch = "master" } rustpython-parser = { git = "https://github.com/RustPython/RustPython", branch = "master" }

View File

@ -1,6 +1,15 @@
extern crate num_bigint;
extern crate inkwell; extern crate inkwell;
extern crate rustpython_parser; extern crate rustpython_parser;
use std::error::Error;
use std::fmt;
use std::path::Path;
use std::collections::HashMap;
use std::fs;
use num_traits::cast::ToPrimitive;
use rustpython_parser::{ast, parser}; use rustpython_parser::{ast, parser};
use inkwell::OptimizationLevel; use inkwell::OptimizationLevel;
@ -12,11 +21,6 @@ use inkwell::types;
use inkwell::types::BasicType; use inkwell::types::BasicType;
use inkwell::values; use inkwell::values;
use std::error::Error;
use std::fmt;
use std::path::Path;
use std::collections::HashMap;
use std::fs;
#[derive(Debug)] #[derive(Debug)]
enum CompileErrorKind { enum CompileErrorKind {
@ -176,6 +180,20 @@ impl<'ctx> CodeGen<'ctx> {
self.set_source_location(expression.location); self.set_source_location(expression.location);
match &expression.node { match &expression.node {
ast::ExpressionType::Number { value: ast::Number::Integer { value } } => {
let mut bits = value.bits();
if value.sign() == num_bigint::Sign::Minus {
bits += 1;
}
match bits {
0..=32 => Ok(self.context.i32_type().const_int(value.to_i32().unwrap() as _, true).into()),
33..=64 => Ok(self.context.i64_type().const_int(value.to_i64().unwrap() as _, true).into()),
_ => Err(self.compile_error(CompileErrorKind::Unsupported("integers larger than 64 bits")))
}
},
ast::ExpressionType::Number { value: ast::Number::Float { value } } => {
Ok(self.context.f64_type().const_float(*value).into())
}
ast::ExpressionType::Identifier { name } => { ast::ExpressionType::Identifier { name } => {
match self.namespace.get(name) { match self.namespace.get(name) {
Some(value) => Ok(*value), Some(value) => Ok(*value),