From 9630b53836c0717a7ac0ab86dda3a4efb5bf9fb9 Mon Sep 17 00:00:00 2001
From: David Li
Date: Tue, 28 Nov 2017 20:16:25 -0500
Subject: Translate function calls
---
src/semantic/analysis.rs | 37 +++++++++++++++++++++++++------------
1 file changed, 25 insertions(+), 12 deletions(-)
(limited to 'src/semantic/analysis.rs')
diff --git a/src/semantic/analysis.rs b/src/semantic/analysis.rs
index 8335719..0c8dfa3 100644
--- a/src/semantic/analysis.rs
+++ b/src/semantic/analysis.rs
@@ -9,7 +9,7 @@ use ::ast::{self, WithLocation};
use super::environment;
use super::frame;
use super::ir;
-use super::translate::{self, Expression, LevelRef, Translate};
+use super::translate::{self, Expression, Level, LevelRef, Translate};
use super::types::{self, Ty};
#[derive(Debug)]
@@ -88,9 +88,10 @@ fn trans_decl<'a, F: frame::Frame>(
level: LevelRef,
venv: &mut VarEnvironment<'a, F>,
tenv: &mut TypeEnvironment<'a>,
- decl: &WithLocation) -> Result<(translate::Expression, Ty)> {
+ decl: &WithLocation) -> Result> {
match decl.declaration {
ast::DeclarationBody::Fun { ref ty, ref params, ref body } => {
+ let new_level = tr.make_level(level, params.iter().map(|_| frame::Escape::Yes));
let declared_ty = if let &Some(ref ty) = ty {
Some(ast::WithLocation::new(trans_ty(venv, tenv, &ty)?, ty.start, ty.end))
} else { None };
@@ -101,12 +102,13 @@ fn trans_decl<'a, F: frame::Frame>(
for param in params.iter() {
let arg_ty = trans_ty(&mut new_venv, &mut new_tenv, ¶m.ty)?;
arg_types.push(arg_ty.clone());
- // TODO:
- // new_venv.add_binding(param.name.value.clone(), arg_ty);
+ // TODO: don't assume args are in registers
+ new_venv.add_binding(param.name.value.clone(),
+ VarValue::Variable(unimplemented!(), arg_ty));
}
let (body_exp, body_ty) =
- trans_exp(tr, level, &mut new_venv, &mut new_tenv, &*body)?;
+ trans_exp(tr, new_level.clone(), &mut new_venv, &mut new_tenv, &*body)?;
if let Some(decl_ty) = declared_ty {
if &decl_ty.value != &body_ty {
@@ -117,8 +119,13 @@ fn trans_decl<'a, F: frame::Frame>(
}
}
- return err!(decl, TypeError::Unimplemented);
- // Ok(Ty::Function(arg_types, Box::new(body_ty)))
+ let label = new_level.borrow().to_exp();
+ Ok(VarValue::Function {
+ level: new_level,
+ label: label,
+ body: body_exp,
+ ty: Ty::Function(arg_types, Box::new(body_ty)),
+ })
}
ast::DeclarationBody::Ty { ref ty } => {
return err!(decl, TypeError::Unimplemented);
@@ -136,7 +143,9 @@ fn trans_decl<'a, F: frame::Frame>(
});
}
}
- Ok((tr.alloc_local(&mut level.borrow_mut(), frame::Escape::Yes), actual_ty))
+ Ok(VarValue::Variable(
+ tr.alloc_local(&mut level.borrow_mut(), frame::Escape::Yes),
+ actual_ty))
}
}
}
@@ -155,13 +164,14 @@ fn trans_exp<'a, F: frame::Frame>(
let mut new_venv = VarEnvironment::new(Some(venv));
let mut new_tenv = TypeEnvironment::new(Some(tenv));
for decl in decls.iter() {
- let (decl_exp, decl_ty) = trans_decl(tr, level.clone(), &mut new_venv, &mut new_tenv, decl)?;
match decl.declaration {
ast::DeclarationBody::Fun { .. } | ast::DeclarationBody::Var { .. } => {
- new_venv.add_binding(decl.name.clone(), VarValue::Variable(decl_exp, decl_ty));
+ let binding = trans_decl(tr, level.clone(), &mut new_venv, &mut new_tenv, decl)?;
+ new_venv.add_binding(decl.name.clone(), binding);
}
ast::DeclarationBody::Ty { .. } => {
- new_tenv.add_binding(decl.name.clone(), decl_ty);
+ unimplemented!();
+ // new_tenv.add_binding(decl.name.clone(), decl_ty);
}
}
}
@@ -200,7 +210,10 @@ fn trans_exp<'a, F: frame::Frame>(
})
}
}
- Ok((label.clone(), (**result).clone()))
+ Ok((
+ tr.call(label.clone(), arg_types.into_iter().map(|(a, b)| a)),
+ (**result).clone()
+ ))
},
otherwise => {
err!(exp, TypeError::Mismatch {
--
cgit v1.2.3