X-Git-Url: http://git.hcoop.net/bpt/coccinelle.git/blobdiff_plain/c491d8eea333ab3273dc415c7d7af192e1d0b682..7f339edd551eefcd6c99f379ce91c27df997cfe3:/python/yes_pycocci.ml diff --git a/python/yes_pycocci.ml b/python/yes_pycocci.ml index 80b996b..5637951 100644 --- a/python/yes_pycocci.ml +++ b/python/yes_pycocci.ml @@ -1,5 +1,7 @@ (* - * Copyright 2010, INRIA, University of Copenhagen + * Copyright 2012, INRIA + * Julia Lawall, Gilles Muller + * Copyright 2010-2011, INRIA, University of Copenhagen * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix @@ -22,6 +24,7 @@ *) +# 0 "./yes_pycocci.ml" open Ast_c open Common open Pycaml @@ -54,14 +57,16 @@ let _pycocci_tuple6 (a,b,c,d,e,f) = (* ------------------------------------------------------------------- *) -let check_return_value v = +let check_return_value msg v = if v =*= (pynull ()) then (pyerr_print (); + Common.pr2 ("while " ^ msg ^ ":"); raise Pycocciexception) else () -let check_int_return_value v = +let check_int_return_value msg v = if v =|= -1 then (pyerr_print (); + Common.pr2 ("while " ^ msg ^ ":"); raise Pycocciexception) else () @@ -84,8 +89,9 @@ let is_module_loaded module_name = let load_module module_name = if not (is_module_loaded module_name) then + (* let _ = Sys.command("python3 -c 'import " ^ module_name ^ "'") in *) let m = pyimport_importmodule module_name in - check_return_value m; + check_return_value ("importing module " ^ module_name) m; (module_map := (StringMap.add module_name m (!module_map)); m) else get_module module_name @@ -102,41 +108,46 @@ let pycocci_get_class_type fqn = let (module_name, class_name) = split_fqn fqn in let m = get_module module_name in let attr = pyobject_getattrstring(m, class_name) in - check_return_value attr; + check_return_value "obtaining a python class type" attr; attr let pycocci_instantiate_class fqn args = let class_type = pycocci_get_class_type fqn in let obj = pyeval_callobjectwithkeywords(class_type, args, pynull()) in - check_return_value obj; + check_return_value "instantiating a python class" obj; obj (* end python interaction *) let inc_match = ref true +let exited = ref false let include_match v = let truth = pyobject_istrue (pytuple_getitem (v, 1)) in - check_int_return_value truth; + check_int_return_value "testing include_match" truth; inc_match := truth != 0; _pycocci_none () +let sp_exit _ = + exited := true; + _pycocci_none () + let build_method (mname, camlfunc, args) pymodule classx classdict = let cmx = pymethod_new(pywrap_closure camlfunc, args, classx) in let v = pydict_setitemstring(classdict, mname, cmx) in - check_int_return_value v; + check_int_return_value ("building python method " ^ mname) v; () let build_class cname parent methods pymodule = let cd = pydict_new() in - check_return_value cd; + check_return_value "creating a new python dictionary" cd; let cx = pyclass_new(pytuple_fromsingle (pycocci_get_class_type parent), cd, pystring_fromstring cname) in - check_return_value cx; + check_return_value "creating a new python class" cx; List.iter (function meth -> build_method meth pymodule cx cd) methods; let v = pydict_setitemstring(pymodule_getdict pymodule, cname, cx) in - check_int_return_value v; + check_int_return_value ("adding python class " ^ cname) v; (cd, cx) let the_environment = ref [] @@ -167,14 +178,17 @@ let pycocci_init () = (* initialize *) if not !initialised then ( initialised := true; - Unix.putenv "PYTHONPATH" - (Printf.sprintf "%s/coccinelle" (Unix.getenv "HOME")); + (* use python_path_base as default (overridable) dir for coccilib *) + let python_path_base = Printf.sprintf "%s/coccinelle" (Unix.getenv "HOME") in + let python_path = try Unix.getenv "PYTHONPATH" ^ ":" ^ python_path_base + with Not_found -> python_path_base in + Unix.putenv "PYTHONPATH" python_path; let _ = if not (py_isinitialized () != 0) then (if !Flag.show_misc then Common.pr2 "Initializing python\n%!"; py_initialize()) in (* set argv *) - let argv0 = Printf.sprintf "%s%sspatch" (Sys.getcwd ()) (match Sys.os_type with "Win32" -> "\\" | _ -> "/") in + let argv0 = Sys.executable_name in let _ = _pycocci_setargs argv0 in coccinelle_module := (pymodule_new "coccinelle"); @@ -186,15 +200,16 @@ let pycocci_init () = coccinelle_module := pymodule_new "coccinelle"; let mx = !coccinelle_module in let (cd, cx) = build_class "Cocci" (!Flag.pyoutput) - [("include_match", include_match, (pynull())); + [("exit", sp_exit, (pynull())); + ("include_match", include_match, (pynull())); ("has_env_binding", has_environment_binding, (pynull()))] mx in pyoutputinstance := cx; pyoutputdict := cd; let v1 = pydict_setitemstring(module_dictionary, "coccinelle", mx) in - check_int_return_value v1; + check_int_return_value "adding coccinelle python module" v1; let mypystring = pystring_fromstring !cocci_file_name in let v2 = pydict_setitemstring(cd, "cocci_file", mypystring) in - check_int_return_value v2; + check_int_return_value "adding python field cocci_file" v2; ()) else () @@ -206,15 +221,16 @@ let added_variables = ref [] let build_classes env = let _ = pycocci_init () in inc_match := true; + exited := false; the_environment := env; let mx = !coccinelle_module in let dict = pymodule_getdict mx in List.iter (function - "include_match" | "has_env_binding" -> () + "include_match" | "has_env_binding" | "exit" -> () | name -> let v = pydict_delitemstring(dict,name) in - check_int_return_value v) + check_int_return_value ("removing " ^ name ^ " from python coccinelle module") v) !added_variables; added_variables := []; () @@ -222,7 +238,7 @@ let build_classes env = let build_variable name value = let mx = !coccinelle_module in added_variables := name :: !added_variables; - check_int_return_value + check_int_return_value ("build python variable " ^ name) (pydict_setitemstring(pymodule_getdict mx, name, value)) let get_variable name = @@ -244,29 +260,52 @@ let construct_variables mv e = with Not_found -> None in +(* Only string in this representation, so no point let instantiate_Expression(x) = let str = pystring_fromstring (Pycocci_aux.exprrep x) in pycocci_instantiate_class "coccilib.elems.Expression" (pytuple_fromsingle (str)) in +*) +(* Only string in this representation, so no point let instantiate_Identifier(x) = let str = pystring_fromstring x in pycocci_instantiate_class "coccilib.elems.Identifier" (pytuple_fromsingle (str)) in +*) + + let instantiate_term_list py printer lst = + let (str,elements) = printer lst in + let str = pystring_fromstring str in + let elements = + pytuple_fromarray + (Array.of_list (List.map pystring_fromstring elements)) in + let repr = + pycocci_instantiate_class "coccilib.elems.TermList" + (pytuple_fromarray (Array.of_list [str;elements])) in + let _ = build_variable py repr in () in 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 - () + () *) + | Some (_, Ast_c.MetaExprListVal (exprlist)) -> + instantiate_term_list py Pycocci_aux.exprlistrep exprlist + | Some (_, Ast_c.MetaParamListVal (paramlist)) -> + instantiate_term_list py Pycocci_aux.paramlistrep paramlist + | Some (_, Ast_c.MetaInitListVal (initlist)) -> + instantiate_term_list py Pycocci_aux.initlistrep initlist + | Some (_, Ast_c.MetaFieldListVal (fieldlist)) -> + instantiate_term_list py Pycocci_aux.fieldlistrep fieldlist | Some (_, Ast_c.MetaPosValList l) -> let locs = List.map @@ -293,11 +332,10 @@ let construct_variables mv e = 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 + let str = + pystring_fromstring + "initial value: consider using coccinelle.varname" in + let _ = build_variable py str in ()) mv @@ -310,7 +348,7 @@ let set_coccifile cocci_file = let pyrun_simplestring s = let res = Pycaml.pyrun_simplestring s in - check_int_return_value res; + check_int_return_value ("running simple python string: " ^ s) res; res let py_isinitialized () =