summaryrefslogtreecommitdiffstats
path: root/perl_checker.src/tree.ml
diff options
context:
space:
mode:
Diffstat (limited to 'perl_checker.src/tree.ml')
-rw-r--r--perl_checker.src/tree.ml34
1 files changed, 20 insertions, 14 deletions
diff --git a/perl_checker.src/tree.ml b/perl_checker.src/tree.ml
index e69bd0b..8154eb6 100644
--- a/perl_checker.src/tree.ml
+++ b/perl_checker.src/tree.ml
@@ -116,7 +116,7 @@ let get_exported t =
if exports.export_ok <> [] then warn_with_pos pos "weird, @EXPORT_OK set twice" ;
(match v with
| Call(Deref(I_func, Ident(None, "map", _)),
- [ Anonymous_sub(Block [List [Deref(I_array, Deref(I_scalar, Ident (None, "_", _)))]], _);
+ [ Anonymous_sub(_, Block [List [Deref(I_array, Deref(I_scalar, Ident (None, "_", _)))]], _);
Call(Deref(I_func, Ident(None, "values", _)), [ Deref(I_hash, Ident(None, "EXPORT_TAGS", _))])]) ->
{ exports with export_ok = collect snd exports.export_tags }
| _ -> { exports with export_ok = from_qw v })
@@ -151,7 +151,7 @@ let get_exported t =
Ref(I_array,
List[List[
Call(Deref(I_func, Ident(None, "map", _)),
- [Anonymous_sub(Block [List [Deref(I_array, Deref(I_scalar, Ident(None, "_", _)))]], _);
+ [Anonymous_sub(_, Block [List [Deref(I_array, Deref(I_scalar, Ident(None, "_", _)))]], _);
Call(Deref(I_func, Ident(None, "values", _)), [Deref(I_hash, Ident(None, "EXPORT_TAGS", _))])])
]])
], _)] ->
@@ -246,25 +246,31 @@ let read_xs_extension_from_so global_vars_declared package pos =
true
with Not_found -> false
-let has_proto = function
- | Block (List [Call_op ("=", [My_our ("my", mys, mys_pos); Deref(I_array, Ident(None, "_", _))], _pos)] :: body) ->
- Some(mys, mys_pos, body)
- | _ -> None
-
-let get_proto body =
+let has_proto perl_proto body =
+ match perl_proto with
+ | Some "" -> Some([], raw_pos2pos bpos, [body])
+ | _ ->
+ match body with
+ | Block [] ->
+ Some([ I_array, "_empty" ], raw_pos2pos bpos, [])
+ | Block (List [Call_op ("=", [My_our ("my", mys, mys_pos); Deref(I_array, Ident(None, "_", _))], _pos)] :: body) ->
+ Some(mys, mys_pos, body)
+ | _ -> None
+
+let get_proto perl_proto body =
map_option (fun (mys, _pos, _) ->
let scalars, others = break_at (fun (context, _) -> context <> I_scalar) mys in
let must_have, optional = break_at (fun (_, s) -> String.length s > 2 && (s.[0] = 'o' || s.[0] = 'b') && s.[1] = '_') scalars in
let min = List.length must_have in
{ proto_nb_min = min; proto_nb_max = if others = [] then Some(min + List.length optional) else None }
- ) (has_proto body)
+ ) (has_proto perl_proto body)
let get_vars_declaration global_vars_declared package =
List.iter (function
- | Sub_declaration(Ident(None, name, pos), _perl_proto, body) ->
- Hashtbl.replace package.vars_declared (I_func, name) (pos, ref false, get_proto body)
- | Sub_declaration(Ident(Some fq, name, pos), _perl_proto, body) ->
- Hashtbl.replace global_vars_declared (I_func, fq, name) (pos, get_proto body)
+ | Sub_declaration(Ident(None, name, pos), perl_proto, body) ->
+ Hashtbl.replace package.vars_declared (I_func, name) (pos, ref false, get_proto perl_proto body)
+ | Sub_declaration(Ident(Some fq, name, pos), perl_proto, body) ->
+ Hashtbl.replace global_vars_declared (I_func, fq, name) (pos, get_proto perl_proto body)
| List [ Call_op("=", [My_our("our", ours, pos); _], _) ]
| List [ Call_op("=", [My_our("local", ([ I_scalar, "_" ] as ours), pos); _], _) ]
@@ -293,7 +299,7 @@ let rec fold_tree f env e =
| Some env -> env
| None ->
match e with
- | Anonymous_sub(e', _)
+ | Anonymous_sub(_, e', _)
| Ref(_, e')
| Deref(_, e')
-> fold_tree f env e'