Coccinelle release 0.2.5-rc9
[bpt/coccinelle.git] / python / yes_pycocci.ml
index 8de88e0..a369170 100644 (file)
@@ -1,25 +1,3 @@
-(*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* This file is part of Coccinelle.
-* 
-* Coccinelle is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, according to version 2 of the License.
-* 
-* Coccinelle is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU General Public License for more details.
-* 
-* You should have received a copy of the GNU General Public License
-* along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
-* 
-* The authors reserve the right to distribute this or future versions of
-* Coccinelle under other licenses.
-*)
-
-
 open Ast_c
 open Common
 open Pycaml
@@ -28,6 +6,8 @@ module StringMap = Map.Make (String)
 
 exception Pycocciexception
 
+let python_support = true
+
 (* ------------------------------------------------------------------- *)
 (* The following definitions are from
 http://patches.ubuntu.com/by-release/extracted/debian/c/coccinelle/0.1.5dbs-2/01-system-pycaml
@@ -51,7 +31,7 @@ let _pycocci_tuple6 (a,b,c,d,e,f) =
 (* ------------------------------------------------------------------- *)
 
 let check_return_value v =
-  if v =*= (pynull ()) then 
+  if v =*= (pynull ()) then
          (pyerr_print ();
          raise Pycocciexception)
   else ()
@@ -103,7 +83,8 @@ let pycocci_get_class_type fqn =
 
 let pycocci_instantiate_class fqn args =
   let class_type = pycocci_get_class_type fqn in
-  let obj = pyobject_callobject(class_type, args) in
+  let obj =
+    pyeval_callobjectwithkeywords(class_type, args, pynull()) in
   check_return_value obj;
   obj
 
@@ -141,7 +122,7 @@ let has_environment_binding name =
   let (rule, name) = (Array.get a 1, Array.get a 2) in
   let orule = pystring_asstring rule in
   let oname = pystring_asstring name in
-  let e = List.exists (function (x,y) -> orule =$= x && oname =$= y)
+  let e = List.exists (function (x,y) -> orule =*= x && oname =$= y)
       !the_environment in
   if e then _pycocci_true () else _pycocci_false ()
 
@@ -164,8 +145,8 @@ let pycocci_init () =
   initialised := true;
   Unix.putenv "PYTHONPATH"
       (Printf.sprintf "%s/coccinelle" (Unix.getenv "HOME"));
-  let _ = if not (py_isinitialized () != 0) then 
-       (if !Flag.show_misc then Common.pr2 "Initializing python\n%!"; 
+  let _ = if not (py_isinitialized () != 0) then
+       (if !Flag.show_misc then Common.pr2 "Initializing python\n%!";
        py_initialize()) in
 
   (* set argv *)
@@ -180,7 +161,7 @@ let pycocci_init () =
   let module_dictionary = pyimport_getmoduledict() in
   coccinelle_module := pymodule_new "coccinelle";
   let mx = !coccinelle_module in
-  let (cd, cx) = build_class "Cocci" (!Flag.pyoutput) 
+  let (cd, cx) = build_class "Cocci" (!Flag.pyoutput)
       [("include_match", include_match, (pynull()));
        ("has_env_binding", has_environment_binding, (pynull()))] mx in
   pyoutputinstance := cx;
@@ -220,16 +201,21 @@ let build_variable name value =
   check_int_return_value
     (pydict_setitemstring(pymodule_getdict mx, name, value))
 
-let contains_binding e (_,(r,m)) =
+let get_variable name =
+  let mx = !coccinelle_module in
+  pystring_asstring
+    (pyobject_str(pydict_getitemstring(pymodule_getdict mx, name)))
+
+let contains_binding e (_,(r,m),_) =
   try
-    let _ = List.find (function ((re, rm), _) -> r =$= re && m =$= rm) e in
+    let _ = List.find (function ((re, rm), _) -> r =*= re && m =$= rm) e in
     true
   with Not_found -> false
 
 let construct_variables mv e =
   let find_binding (r,m) =
     try
-      let elem = List.find (function ((re,rm),_) -> r =$= re && m =$= rm) e in
+      let elem = List.find (function ((re,rm),_) -> r =*= re && m =$= rm) e in
       Some elem
     with Not_found -> None
   in
@@ -246,14 +232,14 @@ let construct_variables mv e =
       (pytuple_fromsingle (str))
   in
 
-  List.iter (function (py,(r,m)) ->
+  List.iter (function (py,(r,m),_) ->
     match find_binding (r,m) with
       None -> ()
-    | Some (_, Ast_c.MetaExprVal expr) ->
+    | Some (_, Ast_c.MetaExprVal (expr,_)) ->
        let expr_repr = instantiate_Expression(expr) in
        let _ = build_variable py expr_repr in
        ()
-    | Some (_, Ast_c.MetaIdVal id) ->
+    | Some (_, Ast_c.MetaIdVal (id,_)) ->
        let id_repr = instantiate_Identifier(id) in
        let _ = build_variable py id_repr in
        ()
@@ -272,21 +258,38 @@ let construct_variables mv e =
        let _ = build_variable py pylocs in
        ()
     | Some (_,binding) ->
-       let _ = build_variable py (pystring_fromstring (Pycocci_aux.stringrep binding))
-       in ()
+       let _ =
+        build_variable py
+          (pystring_fromstring (Pycocci_aux.stringrep binding)) in
+       ()
     ) mv;
 
   ()
 
+let construct_script_variables mv =
+  List.iter
+    (function (_,py) ->
+      let vl =
+       let str = pystring_fromstring "initial value" in
+       pycocci_instantiate_class "coccilib.elems.Identifier"
+         (pytuple_fromsingle (str)) in
+      let _ = build_variable py vl in
+      ())
+    mv
+
+let retrieve_script_variables mv =
+  List.map (function (_,py) -> get_variable py) mv
+
 let set_coccifile cocci_file =
        cocci_file_name := cocci_file;
        ()
 
+let pyrun_simplestring s =
+  let res = Pycaml.pyrun_simplestring s in
+  check_int_return_value res;
+  res
 
-let pyrun_simplestring s = 
-  Pycaml.pyrun_simplestring s
-
-let py_isinitialized () = 
+let py_isinitialized () =
   Pycaml.py_isinitialized ()