summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJyun-Yan You <jyyou.tw@gmail.com>2015-10-28 21:59:05 +0800
committerJyun-Yan You <jyyou.tw@gmail.com>2015-10-28 21:59:05 +0800
commit1b50ffedb22cd441dadaadb2cda945abcebd03f0 (patch)
tree340115441afd096bfab1465211cb02af760463f4
parentce13e5293f54057c70a280d5ad89b79669313aa2 (diff)
parent522fbea80bda6a6d94d84c23cdac87f3ad530a04 (diff)
Merge pull request #238 from dimbleby/unsafe-functions
Presume that a function taking a pointer is unsafe
-rw-r--r--src/gen.rs20
-rw-r--r--src/parser.rs7
-rw-r--r--src/types.rs1
3 files changed, 22 insertions, 6 deletions
diff --git a/src/gen.rs b/src/gen.rs
index fc90e5fa..2986cf39 100644
--- a/src/gen.rs
+++ b/src/gen.rs
@@ -1011,11 +1011,13 @@ fn cty_to_rs(ctx: &mut GenCtx, ty: &Type) -> ast::Ty {
},
&TFuncPtr(ref sig) => {
let decl = cfuncty_to_rs(ctx, &*sig.ret_ty, &sig.args[..], sig.is_variadic);
- mk_fnty(ctx, &decl, sig.abi)
+ let unsafety = if sig.is_safe { ast::Unsafety::Normal } else { ast::Unsafety::Unsafe };
+ mk_fnty(ctx, &decl, unsafety, sig.abi)
},
&TFuncProto(ref sig) => {
let decl = cfuncty_to_rs(ctx, &*sig.ret_ty, &sig.args[..], sig.is_variadic);
- mk_fn_proto_ty(ctx, &decl, sig.abi)
+ let unsafety = if sig.is_safe { ast::Unsafety::Normal } else { ast::Unsafety::Unsafe };
+ mk_fn_proto_ty(ctx, &decl, unsafety, sig.abi)
},
&TNamed(ref ti) => {
let id = rust_type_id(ctx, ti.borrow().name.clone());
@@ -1092,9 +1094,12 @@ fn mk_arrty(ctx: &GenCtx, base: &ast::Ty, n: usize) -> ast::Ty {
};
}
-fn mk_fn_proto_ty(ctx: &mut GenCtx, decl: &ast::FnDecl, abi: abi::Abi) -> ast::Ty {
+fn mk_fn_proto_ty(ctx: &mut GenCtx,
+ decl: &ast::FnDecl,
+ unsafety: ast::Unsafety,
+ abi: abi::Abi) -> ast::Ty {
let fnty = ast::TyBareFn(P(ast::BareFnTy {
- unsafety: ast::Unsafety::Normal,
+ unsafety: unsafety,
abi: abi,
lifetimes: Vec::new(),
decl: P(decl.clone())
@@ -1107,9 +1112,12 @@ fn mk_fn_proto_ty(ctx: &mut GenCtx, decl: &ast::FnDecl, abi: abi::Abi) -> ast::T
}
}
-fn mk_fnty(ctx: &mut GenCtx, decl: &ast::FnDecl, abi: abi::Abi) -> ast::Ty {
+fn mk_fnty(ctx: &mut GenCtx,
+ decl: &ast::FnDecl,
+ unsafety: ast::Unsafety,
+ abi: abi::Abi) -> ast::Ty {
let fnty = ast::TyBareFn(P(ast::BareFnTy {
- unsafety: ast::Unsafety::Normal,
+ unsafety: unsafety,
abi: abi,
lifetimes: Vec::new(),
decl: P(decl.clone())
diff --git a/src/parser.rs b/src/parser.rs
index bfb8065d..8c80ea3e 100644
--- a/src/parser.rs
+++ b/src/parser.rs
@@ -218,10 +218,17 @@ fn mk_fn_sig(ctx: &mut ClangParserCtx, ty: &cx::Type, cursor: &Cursor) -> il::Fu
let ret_ty = Box::new(conv_ty(ctx, &ty.ret_type(), cursor));
let abi = get_abi(ty.call_conv());
+ // Function is presumed unsafe if it takes a pointer argument.
+ let is_unsafe = args_lst.iter().any(|arg| match arg.1 {
+ TPtr(_, _, _) => true,
+ _ => false
+ });
+
il::FuncSig {
ret_ty: ret_ty,
args: args_lst,
is_variadic: ty.is_variadic(),
+ is_safe: !is_unsafe,
abi: abi,
}
}
diff --git a/src/types.rs b/src/types.rs
index 5af176bf..80042783 100644
--- a/src/types.rs
+++ b/src/types.rs
@@ -74,6 +74,7 @@ pub struct FuncSig {
pub ret_ty: Box<Type>,
pub args: Vec<(String, Type)>,
pub is_variadic: bool,
+ pub is_safe: bool,
pub abi: abi::Abi,
}