Skip to content

Commit 083d843

Browse files
authored
Merge pull request #197 from nikomatsakis/salsaify
introduce salsa and use a really coarse-grained query
2 parents e87a0cc + 4a2167d commit 083d843

File tree

11 files changed

+313
-29
lines changed

11 files changed

+313
-29
lines changed

Cargo.lock

Lines changed: 214 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ itertools = "0.7.8"
1717
lalrpop-intern = "0.15.1"
1818
petgraph = "0.4.13"
1919
rustyline = "1.0"
20+
salsa = "0.9.1"
2021
serde = "1.0"
2122
serde_derive = "1.0"
2223
stacker = "0.1.2"

chalk-ir/src/fold/subst.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use super::*;
22
use crate::fold::shift::Shift;
3+
use crate::*;
34

45
pub struct Subst<'s> {
56
/// Values to substitute. A reference to a free variable with

src/db.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
use crate::query;
2+
3+
#[derive(Default)]
4+
pub struct ChalkDatabase {
5+
runtime: salsa::Runtime<ChalkDatabase>,
6+
}
7+
8+
impl salsa::Database for ChalkDatabase {
9+
fn salsa_runtime(&self) -> &salsa::Runtime<ChalkDatabase> {
10+
&self.runtime
11+
}
12+
}
13+
14+
salsa::database_storage! {
15+
pub struct DatabaseStorage for ChalkDatabase {
16+
impl query::LoweringDatabase {
17+
fn program_text() for query::ProgramText;
18+
fn lowered_program() for query::LoweredProgram;
19+
}
20+
}
21+
}

src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#![feature(in_band_lifetimes)]
55
#![feature(specialization)]
66
#![feature(step_trait)]
7+
#![feature(try_blocks)]
78

89
extern crate chalk_parse;
910
#[macro_use]
@@ -29,4 +30,7 @@ crate mod coherence;
2930
pub mod errors;
3031
crate mod rules;
3132

33+
mod db;
34+
mod query;
35+
3236
mod test;

src/query.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// https://crates.io/crates/salsa
2+
// hello world https://github.com/salsa-rs/salsa/blob/master/examples/hello_world/main.rs
3+
4+
use crate::rust_ir;
5+
use crate::rust_ir::lowering::LowerProgram;
6+
use chalk_solve::solve::SolverChoice;
7+
use std::sync::Arc;
8+
9+
salsa::query_group! {
10+
pub trait LoweringDatabase: salsa::Database {
11+
fn program_text() -> Arc<String> {
12+
type ProgramText;
13+
14+
storage input;
15+
}
16+
17+
// FIXME: Arc<Result<...>> is only needed because the error type is not clone
18+
fn lowered_program(solver_choice: SolverChoice) -> Result<Arc<rust_ir::Program>, String> {
19+
type LoweredProgram;
20+
21+
// FIXME: only volatile because the Error type does not implement Eq
22+
storage volatile;
23+
}
24+
}
25+
}
26+
27+
fn lowered_program(
28+
db: &impl LoweringDatabase,
29+
solver_choice: SolverChoice,
30+
) -> Result<Arc<rust_ir::Program>, String> {
31+
let x: crate::errors::Result<_> = try {
32+
let text = db.program_text();
33+
Arc::new(chalk_parse::parse_program(&text)?.lower(solver_choice)?)
34+
};
35+
36+
x.map_err(|err| err.to_string())
37+
}

src/rust_ir/lowering/test.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
use crate::test_util::*;
44
use chalk_ir::tls;
55
use chalk_solve::solve::SolverChoice;
6-
use std::sync::Arc;
76

87
#[test]
98
fn lower_success() {
@@ -158,8 +157,7 @@ fn assoc_tys() {
158157

159158
#[test]
160159
fn goal_quantifiers() {
161-
let program =
162-
Arc::new(parse_and_lower_program("trait Foo<A, B> { }", SolverChoice::default()).unwrap());
160+
let program = parse_and_lower_program("trait Foo<A, B> { }", SolverChoice::default()).unwrap();
163161
let goal =
164162
parse_and_lower_goal(&program, "forall<X> {exists<Y> {forall<Z> {Z: Foo<Y, X>}}}").unwrap();
165163
tls::set_current_program(&program, || {
@@ -172,9 +170,8 @@ fn goal_quantifiers() {
172170

173171
#[test]
174172
fn atc_accounting() {
175-
let program = Arc::new(
176-
parse_and_lower_program(
177-
"
173+
let program = parse_and_lower_program(
174+
"
178175
struct Vec<T> { }
179176
180177
trait Iterable {
@@ -187,10 +184,9 @@ fn atc_accounting() {
187184
188185
struct Iter<'a, T> { }
189186
",
190-
SolverChoice::default(),
191-
)
192-
.unwrap(),
193-
);
187+
SolverChoice::default(),
188+
)
189+
.unwrap();
194190
tls::set_current_program(&program, || {
195191
let impl_text = format!("{:#?}", &program.impl_data.values().next().unwrap());
196192
println!("{}", impl_text);

src/test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ fn solve_goal(program_text: &str, goals: Vec<(&str, SolverChoice, &str)>) {
9090
for (goal_text, solver_choice, expected) in goals {
9191
let (program, env) = program_env_cache.entry(solver_choice).or_insert_with(|| {
9292
let program_text = &program_text[1..program_text.len() - 1]; // exclude `{}`
93-
let program = Arc::new(parse_and_lower_program(program_text, solver_choice).unwrap());
93+
let program = parse_and_lower_program(program_text, solver_choice).unwrap();
9494
let env = Arc::new(program.environment());
9595
(program, env)
9696
});

src/test/bench.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ fn run_bench(
1717
bencher: &mut Bencher,
1818
expected: &str,
1919
) {
20-
let program = Arc::new(parse_and_lower_program(program_text, solver_choice).unwrap());
20+
let program = parse_and_lower_program(program_text, solver_choice).unwrap();
2121
let env = Arc::new(program.environment());
2222
chalk_ir::tls::set_current_program(&program, || {
2323
let goal = parse_and_lower_goal(&program, goal_text).unwrap();

src/test/slg.rs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,11 @@ fn solve_goal(program_text: &str, goals: Vec<(usize, usize, &str, &str)>) {
2424
println!("program {}", program_text);
2525
assert!(program_text.starts_with("{"));
2626
assert!(program_text.ends_with("}"));
27-
let program = &Arc::new(
28-
parse_and_lower_program(
29-
&program_text[1..program_text.len() - 1],
30-
SolverChoice::default(),
31-
)
32-
.unwrap(),
33-
);
27+
let program = &parse_and_lower_program(
28+
&program_text[1..program_text.len() - 1],
29+
SolverChoice::default(),
30+
)
31+
.unwrap();
3432
let env = &Arc::new(program.environment());
3533
chalk_ir::tls::set_current_program(&program, || {
3634
for (max_size, num_answers, goal_text, expected) in goals {
@@ -52,13 +50,11 @@ fn solve_goal_fixed_num_answers(program_text: &str, goals: Vec<(usize, usize, &s
5250
println!("program {}", program_text);
5351
assert!(program_text.starts_with("{"));
5452
assert!(program_text.ends_with("}"));
55-
let program = &Arc::new(
56-
parse_and_lower_program(
57-
&program_text[1..program_text.len() - 1],
58-
SolverChoice::default(),
59-
)
60-
.unwrap(),
61-
);
53+
let program = &parse_and_lower_program(
54+
&program_text[1..program_text.len() - 1],
55+
SolverChoice::default(),
56+
)
57+
.unwrap();
6258
let env = &Arc::new(program.environment());
6359
chalk_ir::tls::set_current_program(&program, || {
6460
for (max_size, num_answers, goal_text, expected) in goals {

src/test_util.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,31 @@
11
#![cfg(test)]
22

3+
use crate::db::ChalkDatabase;
34
use crate::errors::Result;
4-
use crate::rust_ir::lowering::{LowerGoal, LowerProgram};
5+
use crate::query::LoweringDatabase;
6+
use crate::query::ProgramText;
7+
use crate::rust_ir::lowering::LowerGoal;
58
use crate::rust_ir::Program;
69
use chalk_ir::Goal;
710
use chalk_parse;
811
use chalk_solve::solve::SolverChoice;
912
use diff;
1013
use itertools::Itertools;
14+
use salsa::Database;
1115
use std::fmt::Write;
16+
use std::prelude::v1::Result as StdResult;
17+
use std::sync::Arc;
1218

13-
pub fn parse_and_lower_program(text: &str, solver_choice: SolverChoice) -> Result<Program> {
14-
chalk_parse::parse_program(text)?.lower(solver_choice)
19+
pub fn parse_and_lower_program(
20+
text: &str,
21+
solver_choice: SolverChoice,
22+
) -> StdResult<Arc<Program>, String> {
23+
let mut db = ChalkDatabase::default();
24+
25+
db.query_mut(ProgramText)
26+
.set((), Arc::new(text.to_string()));
27+
28+
db.lowered_program(solver_choice)
1529
}
1630

1731
pub fn parse_and_lower_goal(program: &Program, text: &str) -> Result<Box<Goal>> {

0 commit comments

Comments
 (0)