1
0
forked from M-Labs/nac3

typedef: make it send

Rc in calls is not send, so we use Arc instead.
This commit is contained in:
pca006132 2021-08-03 12:38:12 +08:00
parent 52dc112410
commit a3acf09bda
3 changed files with 7 additions and 8 deletions
nac3core/src/typecheck
type_inferencer
typedef

View File

@ -1,8 +1,7 @@
use std::cell::RefCell; use std::{cell::RefCell, sync::Arc};
use std::collections::HashMap; use std::collections::HashMap;
use std::convert::{TryInto, From}; use std::convert::{TryInto, From};
use std::iter::once; use std::iter::once;
use std::rc::Rc;
use super::magic_methods::*; use super::magic_methods::*;
use super::symbol_resolver::SymbolResolver; use super::symbol_resolver::SymbolResolver;
@ -53,7 +52,7 @@ pub struct Inferencer<'a> {
pub primitives: &'a PrimitiveStore, pub primitives: &'a PrimitiveStore,
pub virtual_checks: &'a mut Vec<(Type, Type)>, pub virtual_checks: &'a mut Vec<(Type, Type)>,
pub variable_mapping: HashMap<String, Type>, pub variable_mapping: HashMap<String, Type>,
pub calls: &'a mut HashMap<CodeLocation, Rc<Call>>, pub calls: &'a mut HashMap<CodeLocation, Arc<Call>>,
} }
struct NaiveFolder(); struct NaiveFolder();
@ -192,7 +191,7 @@ impl<'a> Inferencer<'a> {
ret: Type, ret: Type,
) -> InferenceResult { ) -> InferenceResult {
let call = let call =
Rc::new(Call { posargs: params, kwargs: HashMap::new(), ret, fun: RefCell::new(None) }); Arc::new(Call { posargs: params, kwargs: HashMap::new(), ret, fun: RefCell::new(None) });
let call = self.unifier.add_ty(TypeEnum::TCall(vec![call].into())); let call = self.unifier.add_ty(TypeEnum::TCall(vec![call].into()));
let fields = once((method, call)).collect(); let fields = once((method, call)).collect();
let record = self.unifier.add_record(fields); let record = self.unifier.add_record(fields);
@ -389,7 +388,7 @@ impl<'a> Inferencer<'a> {
.map(|v| fold::fold_keyword(self, v)) .map(|v| fold::fold_keyword(self, v))
.collect::<Result<Vec<_>, _>>()?; .collect::<Result<Vec<_>, _>>()?;
let ret = self.unifier.get_fresh_var().0; let ret = self.unifier.get_fresh_var().0;
let call = Rc::new(Call { let call = Arc::new(Call {
posargs: args.iter().map(|v| v.custom.unwrap()).collect(), posargs: args.iter().map(|v| v.custom.unwrap()).collect(),
kwargs: keywords kwargs: keywords
.iter() .iter()

View File

@ -42,7 +42,7 @@ struct TestEnvironment {
pub id_to_name: HashMap<usize, String>, pub id_to_name: HashMap<usize, String>,
pub identifier_mapping: HashMap<String, Type>, pub identifier_mapping: HashMap<String, Type>,
pub virtual_checks: Vec<(Type, Type)>, pub virtual_checks: Vec<(Type, Type)>,
pub calls: HashMap<CodeLocation, Rc<Call>>, pub calls: HashMap<CodeLocation, Arc<Call>>,
} }
impl TestEnvironment { impl TestEnvironment {

View File

@ -1,5 +1,5 @@
use itertools::{chain, zip, Itertools}; use itertools::{chain, zip, Itertools};
use std::borrow::Cow; use std::{borrow::Cow, sync::Arc};
use std::cell::RefCell; use std::cell::RefCell;
use std::collections::HashMap; use std::collections::HashMap;
use std::iter::once; use std::iter::once;
@ -70,7 +70,7 @@ pub enum TypeEnum {
TVirtual { TVirtual {
ty: Type, ty: Type,
}, },
TCall(RefCell<Vec<Rc<Call>>>), TCall(RefCell<Vec<Arc<Call>>>),
TFunc(FunSignature), TFunc(FunSignature),
} }