Coccinelle release 1.0.0-rc1
[bpt/coccinelle.git] / parsing_cocci / free_vars.ml
index 9313c3a..ed489e4 100644 (file)
@@ -169,6 +169,9 @@ let collect_refs include_constraints =
     bind (k ty)
       (match Ast.unwrap ty with
        Ast.MetaInit(name,_,_) -> [metaid name]
+      | Ast.MetaInitList(name,Ast.MetaListLen(lenname,_,_),_,_) ->
+         [metaid name;metaid lenname]
+      | Ast.MetaInitList(name,_,_,_) -> [metaid name]
       | _ -> option_default) in
 
   let astfvparam recursor k p =
@@ -199,9 +202,11 @@ let collect_refs include_constraints =
   let mcode r mc =
     if include_constraints
     then
-      match Ast.get_pos_var mc with
-       Ast.MetaPos(name,constraints,_,_,_) -> (metaid name)::constraints
-      | _ -> option_default
+      List.concat
+       (List.map
+          (function Ast.MetaPos(name,constraints,_,_,_) ->
+            (metaid name)::constraints)
+          (Ast.get_pos_var mc))
     else option_default in
 
   V.combiner bind option_default
@@ -281,6 +286,12 @@ let collect_saved =
     bind (k ty)
       (match Ast.unwrap ty with
        Ast.MetaInit(name,TC.Saved,_) -> [metaid name]
+      |        Ast.MetaInitList(name,Ast.MetaListLen (lenname,ls,_),ns,_) ->
+         let namesaved =
+           match ns with TC.Saved -> [metaid name] | _ -> [] in
+         let lensaved =
+           match ls with TC.Saved -> [metaid lenname] | _ -> [] in
+         lensaved @ namesaved
       | _ -> option_default) in
 
   let astfvparam recursor k p =
@@ -320,9 +331,12 @@ let collect_saved =
         | _ -> option_default)) in
 
   let mcode r e =
-    match Ast.get_pos_var e with
-      Ast.MetaPos(name,_,_,TC.Saved,_) -> [metaid name]
-    | _ -> option_default in
+    List.fold_left
+      (function acc ->
+       function
+           Ast.MetaPos(name,_,_,TC.Saved,_) -> (metaid name) :: acc
+         | _ -> acc)
+      option_default (Ast.get_pos_var e) in
 
   V.combiner bind option_default
     mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
@@ -483,12 +497,13 @@ let classify_variables metavar_decls minirules used_after =
     (check_unitary name inherited,inherited) in
 
   let mcode mc =
-    match Ast.get_pos_var mc with
-      Ast.MetaPos(name,constraints,per,unitary,inherited) ->
-       let (unitary,inherited) = classify name in
-       Ast.set_pos_var (Ast.MetaPos(name,constraints,per,unitary,inherited))
-         mc
-    | _ -> mc in
+    let p =
+      List.map
+       (function Ast.MetaPos(name,constraints,per,unitary,inherited) ->
+         let (unitary,inherited) = classify name in
+         Ast.MetaPos(name,constraints,per,unitary,inherited))
+       (Ast.get_pos_var mc) in
+    Ast.set_pos_var p mc in
 
   let ident r k e =
     let e = k e in
@@ -511,13 +526,13 @@ let classify_variables metavar_decls minirules used_after =
     | TC.FunctionPointer(ty) -> TC.FunctionPointer(type_infos ty)
     | TC.Array(ty) -> TC.Array(type_infos ty)
     | TC.EnumName(TC.MV(name,_,_)) ->
-       let (unitary,inherited) = classify (name,(),(),Ast.NoMetaPos) in
+       let (unitary,inherited) = classify (name,(),(),[]) in
        TC.EnumName(TC.MV(name,unitary,inherited))
     | TC.StructUnionName(su,TC.MV(name,_,_)) ->
-       let (unitary,inherited) = classify (name,(),(),Ast.NoMetaPos) in
+       let (unitary,inherited) = classify (name,(),(),[]) in
        TC.StructUnionName(su,TC.MV(name,unitary,inherited))
     | TC.MetaType(name,_,_) ->
-       let (unitary,inherited) = classify (name,(),(),Ast.NoMetaPos) in
+       let (unitary,inherited) = classify (name,(),(),[]) in
        Type_cocci.MetaType(name,unitary,inherited)
     | TC.SignedT(sgn,Some ty) -> TC.SignedT(sgn,Some (type_infos ty))
     | ty -> ty in
@@ -563,6 +578,16 @@ let classify_variables metavar_decls minirules used_after =
       Ast.MetaInit(name,_,_) ->
        let (unitary,inherited) = classify name in
        Ast.rewrap e (Ast.MetaInit(name,unitary,inherited))
+    | Ast.MetaInitList(name,Ast.MetaListLen (lenname,_,_),_,_) ->
+       let (unitary,inherited) = classify name in
+       let (lenunitary,leninherited) = classify lenname in
+       Ast.rewrap e
+         (Ast.MetaInitList
+            (name,Ast.MetaListLen(lenname,lenunitary,leninherited),
+             unitary,inherited))
+    | Ast.MetaInitList(name,lenname,_,_) ->
+       let (unitary,inherited) = classify name in
+       Ast.rewrap e (Ast.MetaInitList(name,lenname,unitary,inherited))
     | _ -> e in
 
   let param r k e =
@@ -802,12 +827,14 @@ let get_neg_pos_list (_,rule) used_after_list =
   let option_default = ([],[]) in
   let metaid (x,_,_,_) = x in
   let mcode r mc =
-    match Ast.get_pos_var mc with
-      Ast.MetaPos(name,constraints,Ast.PER,_,_) ->
-       ([metaid name],constraints)
-    | Ast.MetaPos(name,constraints,Ast.ALL,_,_) ->
-       ([],(metaid name)::constraints)
-    | _ -> option_default in
+    List.fold_left
+      (function (a,b) ->
+       (function
+           Ast.MetaPos(name,constraints,Ast.PER,_,_) ->
+             ((metaid name)::a,constraints@b)
+         | Ast.MetaPos(name,constraints,Ast.ALL,_,_) ->
+             (a,(metaid name)::constraints@b)))
+      option_default (Ast.get_pos_var mc) in
   let v =
     V.combiner bind option_default
     mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode