forked from M-Labs/nac3
FunSignature: add "opts" field
This commit is contained in:
parent
987d17b5e8
commit
219af79017
@ -1054,6 +1054,7 @@ pub fn attributes_writeback(
|
||||
.collect(),
|
||||
ret: ctx.primitives.none,
|
||||
vars: VarMap::default(),
|
||||
opts: vec![],
|
||||
};
|
||||
let args: Vec<_> =
|
||||
values.into_iter().map(|(_, val)| (None, ValueEnum::Dynamic(val))).collect();
|
||||
|
@ -334,6 +334,7 @@ impl Nac3 {
|
||||
}],
|
||||
ret: primitives.none,
|
||||
vars: into_var_map([arg_ty]),
|
||||
opts: vec![],
|
||||
},
|
||||
Arc::new(GenCall::new(Box::new(move |ctx, obj, fun, args, generator| {
|
||||
gen_core_log(ctx, &obj, fun, &args, generator)?;
|
||||
@ -364,6 +365,7 @@ impl Nac3 {
|
||||
],
|
||||
ret: primitives.none,
|
||||
vars: into_var_map([arg_ty]),
|
||||
opts: vec![],
|
||||
},
|
||||
Arc::new(GenCall::new(Box::new(move |ctx, obj, fun, args, generator| {
|
||||
gen_rtio_log(ctx, &obj, fun, &args, generator)?;
|
||||
@ -511,7 +513,7 @@ impl Nac3 {
|
||||
class_name, stmt.location
|
||||
)));
|
||||
}
|
||||
rpc_ids.push((Some((class_obj.clone(), *name)), def_id));
|
||||
rpc_ids.push((Some((class_obj.clone(), *name)), def_id, Some(FuncFlags::Async)));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -576,7 +578,7 @@ impl Nac3 {
|
||||
let irrt = load_irrt(&context, resolver.as_ref());
|
||||
|
||||
let fun_signature =
|
||||
FunSignature { args: vec![], ret: self.primitive.none, vars: VarMap::new() };
|
||||
FunSignature { args: vec![], ret: self.primitive.none, vars: VarMap::new(), opts: vec![] };
|
||||
let mut store = ConcreteTypeStore::new();
|
||||
let mut cache = HashMap::new();
|
||||
let signature = store.from_signature(
|
||||
@ -614,7 +616,7 @@ impl Nac3 {
|
||||
{
|
||||
let rpc_codegen = rpc_codegen_callback();
|
||||
let defs = top_level.definitions.read();
|
||||
for (class_data, id) in &rpc_ids {
|
||||
for (class_data, id, flags) in &rpc_ids {
|
||||
let mut def = defs[id.0].write();
|
||||
match &mut *def {
|
||||
TopLevelDef::Function { codegen_callback, .. } => {
|
||||
@ -933,7 +935,7 @@ impl Nac3 {
|
||||
let builtins = vec![
|
||||
(
|
||||
"now_mu".into(),
|
||||
FunSignature { args: vec![], ret: primitive.int64, vars: VarMap::new() },
|
||||
FunSignature { args: vec![], ret: primitive.int64, vars: VarMap::new(), opts: vec![] },
|
||||
Arc::new(GenCall::new(Box::new(move |ctx, _, _, _, _| {
|
||||
Ok(Some(time_fns.emit_now_mu(ctx)))
|
||||
}))),
|
||||
@ -949,6 +951,7 @@ impl Nac3 {
|
||||
}],
|
||||
ret: primitive.none,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
},
|
||||
Arc::new(GenCall::new(Box::new(move |ctx, _, fun, args, generator| {
|
||||
let arg_ty = fun.0.args[0].ty;
|
||||
@ -969,6 +972,7 @@ impl Nac3 {
|
||||
}],
|
||||
ret: primitive.none,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
},
|
||||
Arc::new(GenCall::new(Box::new(move |ctx, _, fun, args, generator| {
|
||||
let arg_ty = fun.0.args[0].ty;
|
||||
|
@ -297,6 +297,7 @@ impl ConcreteTypeStore {
|
||||
let ty = self.to_unifier_type(unifier, primitives, *cty, cache);
|
||||
TypeVar { id, ty }
|
||||
})),
|
||||
opts: vec![],
|
||||
}),
|
||||
ConcreteTypeEnum::TLiteral { values, .. } => {
|
||||
TypeEnum::TLiteral { values: values.clone(), loc: None }
|
||||
|
@ -124,6 +124,7 @@ fn test_primitives() {
|
||||
],
|
||||
ret: primitives.int32,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
};
|
||||
|
||||
let mut store = ConcreteTypeStore::new();
|
||||
@ -273,6 +274,7 @@ fn test_simple_call() {
|
||||
}],
|
||||
ret: primitives.int32,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
};
|
||||
let fun_ty = unifier.add_ty(TypeEnum::TFunc(signature.clone()));
|
||||
let mut store = ConcreteTypeStore::new();
|
||||
|
@ -77,6 +77,7 @@ pub fn get_exn_constructor(
|
||||
args: exn_cons_args,
|
||||
ret: exn_type,
|
||||
vars: VarMap::default(),
|
||||
opts: vec![],
|
||||
}));
|
||||
let fun_def = TopLevelDef::Function {
|
||||
name: format!("{name}.__init__"),
|
||||
@ -137,6 +138,7 @@ fn create_fn_by_codegen(
|
||||
.collect(),
|
||||
ret: ret_ty,
|
||||
vars: var_map.clone(),
|
||||
opts: vec![],
|
||||
})),
|
||||
var_id: Vec::default(),
|
||||
instance_to_symbol: HashMap::default(),
|
||||
@ -670,6 +672,7 @@ impl<'a> BuiltinBuilder<'a> {
|
||||
],
|
||||
ret: range,
|
||||
vars: VarMap::default(),
|
||||
opts: vec![],
|
||||
}))
|
||||
};
|
||||
|
||||
@ -925,6 +928,7 @@ impl<'a> BuiltinBuilder<'a> {
|
||||
}],
|
||||
ret: self.primitives.option,
|
||||
vars: into_var_map([self.option_tvar]),
|
||||
opts: vec![],
|
||||
})),
|
||||
var_id: vec![self.option_tvar.id],
|
||||
instance_to_symbol: HashMap::default(),
|
||||
@ -1060,6 +1064,7 @@ impl<'a> BuiltinBuilder<'a> {
|
||||
}],
|
||||
ret: self.num_or_ndarray_ty.ty,
|
||||
vars: self.num_or_ndarray_var_map.clone(),
|
||||
opts: vec![],
|
||||
})),
|
||||
var_id: Vec::default(),
|
||||
instance_to_symbol: HashMap::default(),
|
||||
@ -1297,6 +1302,7 @@ impl<'a> BuiltinBuilder<'a> {
|
||||
],
|
||||
ret: ndarray,
|
||||
vars: into_var_map([tv]),
|
||||
opts: vec![],
|
||||
})),
|
||||
var_id: vec![tv.id],
|
||||
instance_to_symbol: HashMap::default(),
|
||||
@ -1356,6 +1362,7 @@ impl<'a> BuiltinBuilder<'a> {
|
||||
],
|
||||
ret: self.ndarray_float_2d,
|
||||
vars: VarMap::default(),
|
||||
opts: vec![],
|
||||
})),
|
||||
var_id: Vec::default(),
|
||||
instance_to_symbol: HashMap::default(),
|
||||
@ -1403,6 +1410,7 @@ impl<'a> BuiltinBuilder<'a> {
|
||||
}],
|
||||
ret: str,
|
||||
vars: VarMap::default(),
|
||||
opts: vec![],
|
||||
})),
|
||||
var_id: Vec::default(),
|
||||
instance_to_symbol: HashMap::default(),
|
||||
@ -1479,6 +1487,7 @@ impl<'a> BuiltinBuilder<'a> {
|
||||
}],
|
||||
ret: self.primitives.int32,
|
||||
vars: into_var_map([arg_tvar]),
|
||||
opts: vec![],
|
||||
})),
|
||||
var_id: Vec::default(),
|
||||
instance_to_symbol: HashMap::default(),
|
||||
@ -1520,6 +1529,7 @@ impl<'a> BuiltinBuilder<'a> {
|
||||
],
|
||||
ret: self.num_ty.ty,
|
||||
vars: self.num_var_map.clone(),
|
||||
opts: vec![],
|
||||
})),
|
||||
var_id: Vec::default(),
|
||||
instance_to_symbol: HashMap::default(),
|
||||
@ -1607,6 +1617,7 @@ impl<'a> BuiltinBuilder<'a> {
|
||||
.collect(),
|
||||
ret: ret_ty.ty,
|
||||
vars: into_var_map([x1_ty, x2_ty, ret_ty]),
|
||||
opts: vec![],
|
||||
})),
|
||||
var_id: vec![x1_ty.id, x2_ty.id],
|
||||
instance_to_symbol: HashMap::default(),
|
||||
@ -1648,6 +1659,7 @@ impl<'a> BuiltinBuilder<'a> {
|
||||
}],
|
||||
ret: self.num_or_ndarray_ty.ty,
|
||||
vars: self.num_or_ndarray_var_map.clone(),
|
||||
opts: vec![],
|
||||
})),
|
||||
var_id: Vec::default(),
|
||||
instance_to_symbol: HashMap::default(),
|
||||
@ -1842,6 +1854,7 @@ impl<'a> BuiltinBuilder<'a> {
|
||||
.collect(),
|
||||
ret: ret_ty.ty,
|
||||
vars: into_var_map([x1_ty, x2_ty, ret_ty]),
|
||||
opts: vec![],
|
||||
})),
|
||||
var_id: vec![ret_ty.id],
|
||||
instance_to_symbol: HashMap::default(),
|
||||
|
@ -1122,6 +1122,7 @@ impl TopLevelComposer {
|
||||
args: arg_types,
|
||||
ret: return_ty,
|
||||
vars: function_var_map,
|
||||
opts: vec![],
|
||||
}));
|
||||
unifier.unify(*dummy_ty, function_ty).map_err(|e| {
|
||||
HashSet::from([e.at(Some(function_ast.location)).to_display(unifier).to_string()])
|
||||
@ -1386,6 +1387,7 @@ impl TopLevelComposer {
|
||||
args: arg_types,
|
||||
ret: ret_type,
|
||||
vars: method_var_map,
|
||||
opts: vec![],
|
||||
}));
|
||||
|
||||
// unify now since function type is not in type annotation define
|
||||
@ -1673,7 +1675,7 @@ impl TopLevelComposer {
|
||||
// they may be changed with our use of placeholders
|
||||
for (def, _) in definition_ast_list.iter().skip(self.builtin_num) {
|
||||
if let TopLevelDef::Function { signature, var_id, .. } = &mut *def.write() {
|
||||
if let TypeEnum::TFunc(FunSignature { args, ret, vars }) =
|
||||
if let TypeEnum::TFunc(FunSignature { args, ret, vars, opts }) =
|
||||
unifier.get_ty(*signature).as_ref()
|
||||
{
|
||||
let new_var_ids = vars
|
||||
@ -1692,6 +1694,7 @@ impl TopLevelComposer {
|
||||
.zip(vars.values())
|
||||
.map(|(id, v)| (*id, *v))
|
||||
.collect(),
|
||||
opts: opts.clone(),
|
||||
};
|
||||
unifier
|
||||
.unification_table
|
||||
@ -1760,6 +1763,7 @@ impl TopLevelComposer {
|
||||
],
|
||||
ret: self_type,
|
||||
vars: VarMap::default(),
|
||||
opts: vec![],
|
||||
}));
|
||||
let cons_fun = TopLevelDef::Function {
|
||||
name: format!("{}.{}", class_name, "__init__"),
|
||||
@ -1807,6 +1811,7 @@ impl TopLevelComposer {
|
||||
args: contor_args,
|
||||
ret: self_type,
|
||||
vars: contor_type_vars,
|
||||
opts: vec![],
|
||||
}));
|
||||
unifier.unify(constructor.unwrap(), contor_type).map_err(|e| {
|
||||
HashSet::from([e
|
||||
@ -1894,7 +1899,7 @@ impl TopLevelComposer {
|
||||
} = &mut *function_def
|
||||
{
|
||||
let signature_ty_enum = unifier.get_ty(*signature);
|
||||
let TypeEnum::TFunc(FunSignature { args, ret, vars }) = signature_ty_enum.as_ref()
|
||||
let TypeEnum::TFunc(FunSignature { args, ret, vars, .. }) = signature_ty_enum.as_ref()
|
||||
else {
|
||||
unreachable!("must be typeenum::tfunc")
|
||||
};
|
||||
|
@ -461,11 +461,13 @@ impl TopLevelComposer {
|
||||
args: vec![],
|
||||
ret: bool,
|
||||
vars: into_var_map([option_type_var]),
|
||||
opts: vec![],
|
||||
}));
|
||||
let unwrap_fun_ty = unifier.add_ty(TypeEnum::TFunc(FunSignature {
|
||||
args: vec![],
|
||||
ret: option_type_var.ty,
|
||||
vars: into_var_map([option_type_var]),
|
||||
opts: vec![],
|
||||
}));
|
||||
let option = unifier.add_ty(TypeEnum::TObj {
|
||||
obj_id: PrimDef::Option.id(),
|
||||
@ -500,6 +502,7 @@ impl TopLevelComposer {
|
||||
args: vec![],
|
||||
ret: ndarray_copy_fun_ret_ty.ty,
|
||||
vars: into_var_map([ndarray_dtype_tvar, ndarray_ndims_tvar]),
|
||||
opts: vec![],
|
||||
}));
|
||||
let ndarray_fill_fun_ty = unifier.add_ty(TypeEnum::TFunc(FunSignature {
|
||||
args: vec![FuncArg {
|
||||
@ -510,6 +513,7 @@ impl TopLevelComposer {
|
||||
}],
|
||||
ret: none,
|
||||
vars: into_var_map([ndarray_dtype_tvar, ndarray_ndims_tvar]),
|
||||
opts: vec![],
|
||||
}));
|
||||
let ndarray = unifier.add_ty(TypeEnum::TObj {
|
||||
obj_id: PrimDef::NDArray.id(),
|
||||
|
@ -199,6 +199,7 @@ pub fn impl_binop(
|
||||
name: "other".into(),
|
||||
is_vararg: false,
|
||||
}],
|
||||
opts: vec![],
|
||||
})),
|
||||
false,
|
||||
)
|
||||
@ -219,6 +220,7 @@ pub fn impl_unaryop(unifier: &mut Unifier, ty: Type, ret_ty: Option<Type>, ops:
|
||||
ret: ret_ty,
|
||||
vars: VarMap::new(),
|
||||
args: vec![],
|
||||
opts: vec![],
|
||||
})),
|
||||
false,
|
||||
),
|
||||
@ -264,6 +266,7 @@ pub fn impl_cmpop(
|
||||
name: "other".into(),
|
||||
is_vararg: false,
|
||||
}],
|
||||
opts: vec![],
|
||||
})),
|
||||
false,
|
||||
),
|
||||
|
@ -464,12 +464,14 @@ impl<'a> Fold<()> for Inferencer<'a> {
|
||||
|var| var.custom.unwrap(),
|
||||
),
|
||||
vars: VarMap::default(),
|
||||
opts: vec![],
|
||||
});
|
||||
let enter = self.unifier.add_ty(enter);
|
||||
let exit = TypeEnum::TFunc(FunSignature {
|
||||
args: vec![],
|
||||
ret: self.unifier.get_dummy_var().ty,
|
||||
vars: VarMap::default(),
|
||||
opts: vec![],
|
||||
});
|
||||
let exit = self.unifier.add_ty(exit);
|
||||
let mut fields = HashMap::new();
|
||||
@ -766,6 +768,7 @@ impl<'a> Inferencer<'a> {
|
||||
.collect(),
|
||||
ret,
|
||||
vars: VarMap::default(),
|
||||
opts: vec![],
|
||||
};
|
||||
let body = new_context.fold_expr(body)?;
|
||||
new_context.unify(fun.ret, body.custom.unwrap(), &location)?;
|
||||
@ -1107,6 +1110,7 @@ impl<'a> Inferencer<'a> {
|
||||
}],
|
||||
ret: ret_ty,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
}));
|
||||
|
||||
return Ok(Some(Located {
|
||||
@ -1166,6 +1170,7 @@ impl<'a> Inferencer<'a> {
|
||||
}],
|
||||
ret,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
}));
|
||||
|
||||
return Ok(Some(Located {
|
||||
@ -1214,6 +1219,7 @@ impl<'a> Inferencer<'a> {
|
||||
],
|
||||
ret,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
}));
|
||||
|
||||
return Ok(Some(Located {
|
||||
@ -1253,6 +1259,7 @@ impl<'a> Inferencer<'a> {
|
||||
}],
|
||||
ret,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
}));
|
||||
|
||||
return Ok(Some(Located {
|
||||
@ -1365,6 +1372,7 @@ impl<'a> Inferencer<'a> {
|
||||
],
|
||||
ret,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
}));
|
||||
|
||||
return Ok(Some(Located {
|
||||
@ -1445,6 +1453,7 @@ impl<'a> Inferencer<'a> {
|
||||
}],
|
||||
ret,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
}));
|
||||
|
||||
return Ok(Some(Located {
|
||||
@ -1487,6 +1496,7 @@ impl<'a> Inferencer<'a> {
|
||||
}],
|
||||
ret,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
}));
|
||||
|
||||
return Ok(Some(Located {
|
||||
@ -1532,6 +1542,7 @@ impl<'a> Inferencer<'a> {
|
||||
],
|
||||
ret,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
}));
|
||||
|
||||
return Ok(Some(Located {
|
||||
@ -1586,6 +1597,7 @@ impl<'a> Inferencer<'a> {
|
||||
],
|
||||
ret,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
}));
|
||||
|
||||
return Ok(Some(Located {
|
||||
@ -1654,6 +1666,7 @@ impl<'a> Inferencer<'a> {
|
||||
],
|
||||
ret,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
}));
|
||||
|
||||
return Ok(Some(Located {
|
||||
|
@ -91,6 +91,7 @@ impl TestEnvironment {
|
||||
}],
|
||||
ret: int32,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
}));
|
||||
fields.insert("__add__".into(), (add_ty, false));
|
||||
});
|
||||
@ -237,6 +238,7 @@ impl TestEnvironment {
|
||||
}],
|
||||
ret: int32,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
}));
|
||||
fields.insert("__add__".into(), (add_ty, false));
|
||||
});
|
||||
@ -386,6 +388,7 @@ impl TestEnvironment {
|
||||
args: vec![],
|
||||
ret: foo_ty,
|
||||
vars: into_var_map([tvar]),
|
||||
opts: vec![],
|
||||
})),
|
||||
);
|
||||
|
||||
@ -393,6 +396,7 @@ impl TestEnvironment {
|
||||
args: vec![],
|
||||
ret: int32,
|
||||
vars: IndexMap::default(),
|
||||
opts: vec![],
|
||||
}));
|
||||
let bar = unifier.add_ty(TypeEnum::TObj {
|
||||
obj_id: DefinitionId(defs + 2),
|
||||
@ -420,6 +424,7 @@ impl TestEnvironment {
|
||||
args: vec![],
|
||||
ret: bar,
|
||||
vars: IndexMap::default(),
|
||||
opts: vec![],
|
||||
})),
|
||||
);
|
||||
|
||||
@ -449,6 +454,7 @@ impl TestEnvironment {
|
||||
args: vec![],
|
||||
ret: bar2,
|
||||
vars: IndexMap::default(),
|
||||
opts: vec![],
|
||||
})),
|
||||
);
|
||||
let class_names: HashMap<_, _> = [("Bar".into(), bar), ("Bar2".into(), bar2)].into();
|
||||
|
@ -123,11 +123,17 @@ impl FuncArg {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum FunOption {
|
||||
Async,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct FunSignature {
|
||||
pub args: Vec<FuncArg>,
|
||||
pub ret: Type,
|
||||
pub vars: VarMap,
|
||||
pub opts: Vec<FunOption>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
@ -1565,7 +1571,7 @@ impl Unifier {
|
||||
None
|
||||
}
|
||||
}
|
||||
TypeEnum::TFunc(FunSignature { args, ret, vars: params }) => {
|
||||
TypeEnum::TFunc(FunSignature { args, ret, vars: params, opts }) => {
|
||||
let new_params = self.subst_map(params, mapping, cache);
|
||||
let new_ret = self.subst_impl(*ret, mapping, cache);
|
||||
let mut new_args = Cow::from(args);
|
||||
@ -1580,7 +1586,8 @@ impl Unifier {
|
||||
let params = new_params.unwrap_or_else(|| params.clone());
|
||||
let ret = new_ret.unwrap_or(*ret);
|
||||
let args = new_args.into_owned();
|
||||
Some(self.add_ty(TypeEnum::TFunc(FunSignature { args, ret, vars: params })))
|
||||
let opts = opts.clone();
|
||||
Some(self.add_ty(TypeEnum::TFunc(FunSignature { args, ret, vars: params, opts })))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
|
@ -389,6 +389,7 @@ fn test_virtual() {
|
||||
args: vec![],
|
||||
ret: int,
|
||||
vars: VarMap::new(),
|
||||
opts: vec![],
|
||||
}));
|
||||
let bar = env.unifier.add_ty(TypeEnum::TObj {
|
||||
obj_id: DefinitionId(5),
|
||||
|
@ -360,7 +360,7 @@ fn main() {
|
||||
}
|
||||
}
|
||||
|
||||
let signature = FunSignature { args: vec![], ret: primitive.int32, vars: VarMap::new() };
|
||||
let signature = FunSignature { args: vec![], ret: primitive.int32, vars: VarMap::new(), opts: vec![] };
|
||||
let mut store = ConcreteTypeStore::new();
|
||||
let mut cache = HashMap::new();
|
||||
let signature = store.from_signature(&mut composer.unifier, &primitive, &signature, &mut cache);
|
||||
|
Loading…
Reference in New Issue
Block a user