-(*
-* 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
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
(* ------------------------------------------------------------------- *)
let check_return_value v =
- if v =*= (pynull ()) then
+ if v =*= (pynull ()) then
(pyerr_print ();
raise Pycocciexception)
else ()
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
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 ()
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 *)
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;
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
(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
()
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 ()