diff options
author | David Hotham <david.hotham@metaswitch.com> | 2015-10-24 10:30:04 +0100 |
---|---|---|
committer | David Hotham <david.hotham@metaswitch.com> | 2015-10-24 11:01:46 +0100 |
commit | 522fbea80bda6a6d94d84c23cdac87f3ad530a04 (patch) | |
tree | 2c61ec9b194f2572f643ac1888466c691a08823a | |
parent | 56faaf291d87355c204bf7deec66128d6090d4d1 (diff) |
Presume that a function taking a pointer is unsafe
-rw-r--r-- | src/gen.rs | 20 | ||||
-rw-r--r-- | src/parser.rs | 7 | ||||
-rw-r--r-- | src/types.rs | 1 |
3 files changed, 22 insertions, 6 deletions
@@ -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, } |