Skip to content

Commit ce04174

Browse files
committed
refactor: Remove the global table from the vm
1 parent 80ec849 commit ce04174

File tree

16 files changed

+313
-355
lines changed

16 files changed

+313
-355
lines changed

Cargo.lock

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

build.rs

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,24 @@
1-
extern crate gluon_base;
2-
extern crate itertools;
3-
extern crate walkdir;
1+
use std::{
2+
env,
3+
fs::File,
4+
io::{Read, Write},
5+
path::Path,
6+
};
47

5-
use std::env;
6-
use std::fs::File;
7-
use std::io::{Read, Write};
8-
use std::path::Path;
9-
10-
use itertools::Itertools;
11-
12-
use walkdir::WalkDir;
8+
use {itertools::Itertools, walkdir::WalkDir};
139

1410
use gluon_base::filename_to_module;
1511

1612
#[cfg(feature = "test")]
1713
mod gen_skeptic {
18-
extern crate little_skeptic as skeptic;
19-
extern crate walkdir;
14+
use little_skeptic as skeptic;
2015

21-
use std::env;
22-
use std::fs::{self, File};
23-
use std::io::prelude::*;
24-
use std::path::{Path, PathBuf};
16+
use std::{
17+
env,
18+
fs::{self, File},
19+
io::Read,
20+
path::{Path, PathBuf},
21+
};
2522

2623
/// skeptic templates look for `rust` after the opening code fences so writing
2724
/// ```f#,rust
@@ -64,14 +61,12 @@ return;
6461
File::open(file)
6562
.and_then(|mut raw_file| raw_file.read_to_end(&mut contents))
6663
.unwrap();
67-
File::create(&out_file_name)
68-
.and_then(|mut out_file| out_file.write_all(&contents))
69-
.unwrap();
64+
fs::write(&out_file_name, contents).unwrap();
7065
out_file_name.to_str().expect("UTF-8 string").into()
7166
}
7267

7368
pub fn generate() {
74-
let test_locations: Vec<_> = self::walkdir::WalkDir::new("book/src")
69+
let test_locations: Vec<_> = walkdir::WalkDir::new("book/src")
7570
.into_iter()
7671
.filter_map(|e| {
7772
let e = e.unwrap();

doc/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ impl DocCollector<'_> {
549549
);
550550

551551
let (expr, typ) = thread.typecheck_str(&name, &content, None)?;
552-
let (meta, _) = metadata(&thread.get_database(), &expr.expr());
552+
let (meta, _) = metadata(&thread.get_database().as_env(), &expr.expr());
553553

554554
create_dir_all(out_path.join(module_path.parent().unwrap_or(Path::new(""))))?;
555555

repl/src/repl.rs

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@ use crate::vm::{
2020
IO,
2121
},
2222
internal::ValuePrinter,
23-
thread::{ActiveThread, RootedValue, Thread, ThreadInternal},
23+
thread::{ActiveThread, RootedValue, Thread},
2424
{self, Error as VMError, Result as VMResult},
2525
};
2626

2727
use gluon::{
2828
compiler_pipeline::{Executable, ExecuteValue},
2929
import::add_extern_module,
30+
query::CompilerDatabase,
3031
Error as GluonError, Result as GluonResult, RootedThread, ThreadExt,
3132
};
3233

@@ -436,6 +437,9 @@ async fn eval_line_(vm: RootedThread, line: &str) -> gluon::Result<()> {
436437
let ExecuteValue { value, typ, .. } = (&mut eval_expr)
437438
.run_expr(&mut module_compiler, vm.clone(), "line", line, None)
438439
.await?;
440+
441+
drop(db);
442+
439443
if is_let_binding {
440444
let mut expr = eval_expr.expr();
441445
let mut last_bind = None;
@@ -448,7 +452,13 @@ async fn eval_line_(vm: RootedThread, line: &str) -> gluon::Result<()> {
448452
_ => break,
449453
}
450454
}
451-
set_globals(&vm, &last_bind.unwrap().name, &typ, &value.as_ref())?;
455+
set_globals(
456+
&vm,
457+
&mut vm.get_database_mut(),
458+
&last_bind.unwrap().name,
459+
&typ,
460+
&value.as_ref(),
461+
)?;
452462
}
453463
let vm = value.vm();
454464
let env = vm.get_env();
@@ -464,33 +474,34 @@ async fn eval_line_(vm: RootedThread, line: &str) -> gluon::Result<()> {
464474

465475
fn set_globals(
466476
vm: &Thread,
477+
db: &mut CompilerDatabase,
467478
pattern: &SpannedPattern<Symbol>,
468479
typ: &ArcType,
469480
value: &RootedValue<&Thread>,
470481
) -> GluonResult<()> {
471482
match pattern.value {
472483
Pattern::Ident(ref id) => {
473-
vm.set_global(
474-
Symbol::from(format!("@{}", id.name.declared_name())),
484+
db.set_global(
485+
id.name.declared_name(),
475486
typ.clone(),
476487
Default::default(),
477488
value.get_value(),
478-
)?;
489+
);
479490
Ok(())
480491
}
481492
Pattern::Tuple { ref elems, .. } => {
482493
let iter = elems
483494
.iter()
484495
.zip(crate::vm::dynamic::field_iter(&value, typ, vm));
485496
for (elem_pattern, (elem_value, elem_type)) in iter {
486-
set_globals(vm, elem_pattern, &elem_type, &elem_value)?;
497+
set_globals(vm, db, elem_pattern, &elem_type, &elem_value)?;
487498
}
488499
Ok(())
489500
}
490501
Pattern::Record { ref fields, .. } => {
491502
let resolved_type = {
492503
let mut type_cache = vm.global_env().type_cache();
493-
let env = vm.get_env();
504+
let env = db.as_env();
494505
resolve::remove_aliases_cow(&env, &mut type_cache, typ)
495506
};
496507

@@ -517,26 +528,26 @@ fn set_globals(
517528
.clone();
518529
match pattern_value {
519530
Some(ref sub_pattern) => {
520-
set_globals(vm, sub_pattern, &field_type, &field_value)?
531+
set_globals(vm, db, sub_pattern, &field_type, &field_value)?
521532
}
522-
None => vm.set_global(
523-
Symbol::from(format!("@{}", name.value.declared_name())),
533+
None => db.set_global(
534+
name.value.declared_name(),
524535
field_type.to_owned(),
525536
Default::default(),
526537
field_value.get_value(),
527-
)?,
538+
),
528539
}
529540
}
530541
Ok(())
531542
}
532543
Pattern::As(ref id, ref pattern) => {
533-
vm.set_global(
534-
Symbol::from(format!("@{}", id.value.declared_name())),
544+
db.set_global(
545+
id.value.declared_name(),
535546
typ.clone(),
536547
Default::default(),
537548
value.get_value(),
538-
)?;
539-
set_globals(vm, pattern, typ, value)
549+
);
550+
set_globals(vm, db, pattern, typ, value)
540551
}
541552
Pattern::Constructor(..) | Pattern::Literal(_) | Pattern::Error => {
542553
Err(VMError::Message("The repl cannot bind variables from this pattern".into()).into())

src/compiler_pipeline.rs

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ use crate::{
2828
types::{ArcType, NullInterner, Type, TypeCache},
2929
},
3030
check::{metadata, rename},
31-
query::{Compilation, CompilerDatabase},
31+
query::{env, Compilation, CompilerDatabase},
3232
vm::{
3333
compiler::CompiledModule,
3434
core::{self, interpreter, CoreExpr},
3535
macros::MacroExpander,
3636
thread::{RootedThread, RootedValue, Thread, ThreadInternal, VmRoot},
3737
},
38-
Error, ModuleCompiler, Result,
38+
Error, ModuleCompiler, Result, ThreadExt,
3939
};
4040

4141
pub type BoxFuture<'vm, T, E> =
@@ -394,8 +394,8 @@ where
394394
_file: &str,
395395
_expr_str: &str,
396396
) -> SalvageResult<WithMetadata<Self::Expr>> {
397-
let env = &*compiler.database;
398-
let (metadata, metadata_map) = metadata::metadata(env, self.expr.borrow_mut().expr_mut());
397+
let env = env(compiler.database);
398+
let (metadata, metadata_map) = metadata::metadata(&env, self.expr.borrow_mut().expr_mut());
399399
Ok(WithMetadata {
400400
expr: self.expr,
401401
metadata,
@@ -605,12 +605,12 @@ fn typecheck_expr(
605605
metadata_map: &mut FnvMap<Symbol, Arc<Metadata>>,
606606
) -> Result<ArcType> {
607607
use crate::check::typecheck::Typecheck;
608-
let env = &*compiler.database;
608+
let env = env(compiler.database);
609609
let (arena, expr) = expr.arena_expr();
610610
let mut tc = Typecheck::new(
611611
file.into(),
612612
&mut compiler.symbols,
613-
&*env,
613+
&env,
614614
&thread.global_env().type_cache(),
615615
metadata_map,
616616
arena.borrow(),
@@ -658,7 +658,7 @@ where
658658
typ: expr
659659
.borrow_mut()
660660
.expr()
661-
.try_type_of(&*compiler.database)
661+
.try_type_of(&env(compiler.database))
662662
.unwrap_or_else(|_| thread.global_env().type_cache().error()),
663663
expr,
664664
metadata_map,
@@ -671,8 +671,8 @@ where
671671

672672
// Some metadata requires typechecking so recompute it if full metadata is required
673673
let (metadata, metadata_map) = if compiler.compiler_settings().full_metadata {
674-
let env = &*compiler.database;
675-
metadata::metadata(&*env, expr.borrow_mut().expr_mut())
674+
let env = env(compiler.database);
675+
metadata::metadata(&env, expr.borrow_mut().expr_mut())
676676
} else {
677677
(metadata, metadata_map)
678678
};
@@ -824,22 +824,23 @@ where
824824
let core_expr;
825825

826826
let mut module = {
827-
let env = &*compiler.database;
828-
829-
core_expr = core::with_translator(&*env, |translator| {
830-
let expr = translator.translate_expr(self.expr.borrow().expr());
831-
832-
debug!("Translation returned: {}", expr);
833-
834-
if settings.optimize {
835-
core::optimize::optimize(&translator.allocator, env, expr)
836-
} else {
837-
interpreter::Global {
838-
value: core::freeze_expr(&translator.allocator, expr),
839-
info: Default::default(),
827+
core_expr = {
828+
let env = env(compiler.database);
829+
core::with_translator(&env, |translator| {
830+
let expr = translator.translate_expr(self.expr.borrow().expr());
831+
832+
debug!("Translation returned: {}", expr);
833+
834+
if settings.optimize {
835+
core::optimize::optimize(&translator.allocator, &env, expr)
836+
} else {
837+
interpreter::Global {
838+
value: core::freeze_expr(&translator.allocator, expr),
839+
info: Default::default(),
840+
}
840841
}
841-
}
842-
});
842+
})
843+
};
843844

844845
debug!("Optimization returned: {}", core_expr);
845846

@@ -854,8 +855,9 @@ where
854855
&mut compiler.symbols,
855856
);
856857

858+
let env = env(compiler.database);
857859
let mut compiler = Compiler::new(
858-
&*env,
860+
&env,
859861
thread.global_env(),
860862
symbols,
861863
&source,
@@ -1114,7 +1116,7 @@ where
11141116

11151117
async fn load_script<T>(
11161118
self,
1117-
compiler: &mut ModuleCompiler<'_>,
1119+
_compiler: &mut ModuleCompiler<'_>,
11181120
vm: T,
11191121
name: &str,
11201122
_expr_str: &str,
@@ -1124,9 +1126,7 @@ where
11241126
T: Send + Sync + VmRoot<'vm>,
11251127
'vm: 'async_trait,
11261128
{
1127-
use crate::vm::internal::Global;
1128-
use crate::vm::serialization::DeSeed;
1129-
use base::symbol::SymbolData;
1129+
use crate::vm::{internal::Global, serialization::DeSeed};
11301130

11311131
let Global {
11321132
metadata,
@@ -1136,12 +1136,8 @@ where
11361136
} = DeSeed::new(&vm, &mut vm.current_context())
11371137
.deserialize(self.0)
11381138
.map_err(|err| err.to_string())?;
1139-
let id = compiler.symbols.symbol(SymbolData {
1140-
global: true,
1141-
location: None,
1142-
name: name,
1143-
});
1144-
vm.set_global(id, typ, metadata.clone(), &value)?;
1139+
vm.get_database_mut()
1140+
.set_global(name, typ, metadata.clone(), &value);
11451141
info!("Loaded module `{}`", name);
11461142
Ok(())
11471143
}

src/import.rs

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -390,12 +390,8 @@ impl<I> Import<I> {
390390
/// Adds an extern module to `thread`, letting it be loaded with `import! name` from gluon code.
391391
///
392392
/// ```
393-
/// extern crate gluon;
394-
/// #[macro_use]
395-
/// extern crate gluon_vm;
396-
///
397393
/// use gluon::vm::{self, ExternModule};
398-
/// use gluon::{Thread, ThreadExt};
394+
/// use gluon::{primitive, record, Thread, ThreadExt};
399395
/// use gluon::import::add_extern_module;
400396
///
401397
/// fn yell(s: &str) -> String {
@@ -412,22 +408,18 @@ impl<I> Import<I> {
412408
/// )
413409
/// }
414410
///
415-
/// fn main_() -> gluon::Result<()> {
416-
/// let thread = gluon::new_vm();
411+
/// #[tokio::main]
412+
/// async fn main() -> gluon::Result<()> {
413+
/// let thread = gluon::new_vm_async().await;
417414
/// add_extern_module(&thread, "my_module", my_module);
418415
/// let script = r#"
419416
/// let module = import! "my_module"
420417
/// module.yell module.message
421418
/// "#;
422-
/// let (result, _) = thread.run_expr::<String>("example", script)?;
419+
/// let (result, _) = thread.run_expr_async::<String>("example", script).await?;
423420
/// assert_eq!(result, "HELLO WORLD!");
424421
/// Ok(())
425422
/// }
426-
/// fn main() {
427-
/// if let Err(err) = main_() {
428-
/// panic!("{}", err)
429-
/// }
430-
/// }
431423
/// ```
432424
pub fn add_extern_module<F>(thread: &Thread, name: &str, loader: F)
433425
where
@@ -506,9 +498,9 @@ where
506498
id: TypeId,
507499
) -> Option<Box<dyn Any>> {
508500
if id == TypeId::of::<Box<dyn VmEnv>>() {
509-
Some(Box::new(
510-
Box::new(self.snapshot(thread.root_thread())) as Box<dyn VmEnv>
511-
))
501+
Some(Box::new(Box::new(crate::query::snapshot_env(
502+
self.snapshot(thread.root_thread()),
503+
)) as Box<dyn VmEnv>))
512504
} else if id == TypeId::of::<Arc<dyn ImportApi>>() {
513505
Some(Box::new(
514506
arc_self.clone().downcast_arc::<Self>().ok().unwrap() as Arc<dyn ImportApi>,

0 commit comments

Comments
 (0)