From: Prashanth Mundkur Date: Fri, 15 May 2009 00:31:13 +0000 (-0700) Subject: properly handle rpcs that don't take any params (make them take ():unit) X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=2346b1332b86250343748b74e557d17b5d93decb;p=xenclient%2Ftoolstack.git properly handle rpcs that don't take any params (make them take ():unit) --- diff --git a/gen/rpc/codegen.ml b/gen/rpc/codegen.ml index edbb7d6..4e92f6c 100644 --- a/gen/rpc/codegen.ml +++ b/gen/rpc/codegen.ml @@ -65,18 +65,23 @@ module Server = struct fprintf ff "@]@\nend@\n@\n@?" let gen_dispatch_struct ff server rpc_list notif_list = + let get_arg_types params = + match params with + | [] -> [ "unit" ] + | _ -> List.map (fun p -> p.param_type) params + in let sig_name = (String.lowercase server.server_name) ^ "_impl" in fprintf ff "type %s =@\n" sig_name; fprintf ff "@[{@,"; fprintf ff "(* RPCs *)"; List.iter (fun (rpc, resp) -> - let sg = List.map (fun p -> p.param_type) rpc.rpc_request.request_params in + let sg = get_arg_types rpc.rpc_request.request_params in let sg = sg @ [ resp.response_value.param_type ] in fprintf ff "@,%s: %s;" rpc.rpc_request.request_handler (String.concat " -> " sg) ) rpc_list; fprintf ff "@,@,(* Notifications *)"; List.iter (fun n -> - let sg = List.map (fun p -> p.param_type) n.rpc_request.request_params in + let sg = get_arg_types n.rpc_request.request_params in let sg = sg @ [ "unit" ] in fprintf ff "@,%s: %s;" n.rpc_request.request_handler (String.concat " -> " sg) ) notif_list; @@ -96,17 +101,25 @@ module Server = struct let methname = rpc.rpc_request.request_handler in let params = rpc.rpc_request.request_params in fprintf ff "@[| \"%s\" ->@," rpc.rpc_request.request_name; - fprintf ff "let %s = Json_conv.get_array %s.Jsonrpc.params in@," arrvn reqvn; - fprintf ff "Json_conv.check_array_with_length %s %d;@," arrvn (List.length params); - let paramsv, venv, _ = - List.fold_left (fun (alist, venv, i) p -> - let a, venv = gen_param ff venv arrvn i p in - (a :: alist), venv, (i + 1) - ) ([], venv, 0) params in + let args_str, venv = + (match params with + | [] -> + "()", venv + | _ -> + fprintf ff "let %s = Json_conv.get_array %s.Jsonrpc.params in@," arrvn reqvn; + fprintf ff "Json_conv.check_array_with_length %s %d;@," arrvn (List.length params); + let paramsv, venv, _ = + List.fold_left (fun (alist, venv, i) p -> + let a, venv = gen_param ff venv arrvn i p in + (a :: alist), venv, (i + 1) + ) ([], venv, 0) params in + + (String.concat " " (List.map (fun v -> name_of_var v) (List.rev paramsv))), venv + ) + in let respv, venv = Var_env.new_ident_from_name venv "resp" in let respjv, venv = Var_env.new_ident_from_name venv "resp_j" in let respvn, respjvn = name_of_var respv, name_of_var respjv in - let args_str = String.concat " " (List.map (fun v -> name_of_var v) (List.rev paramsv)) in fprintf ff "let %s = %s.%s %s in@," respvn impl_module methname args_str; fprintf ff "let %s = %s_to_json %s in@," respjvn resp.response_value.param_type respvn; fprintf ff "Jsonrpc.Result %s@]@," respjvn @@ -117,14 +130,21 @@ module Server = struct let methname = rpc.rpc_request.request_handler in let params = rpc.rpc_request.request_params in fprintf ff "@[| \"%s\" ->@," rpc.rpc_request.request_name; - fprintf ff "let %s = Json_conv.get_array %s.Jsonrpc.params in@," arrvn reqvn; - fprintf ff "Json_conv.check_array_with_length %s %d;@," arrvn (List.length params); - let paramsv, venv, _ = - List.fold_left (fun (alist, venv, i) p -> - let a, venv = gen_param ff venv arrvn i p in - (a :: alist), venv, (i + 1) - ) ([], venv, 0) params in - let args_str = String.concat " " (List.map (fun v -> name_of_var v) (List.rev paramsv)) in + let args_str, venv = + (match params with + | [] -> + "()", venv + | _ -> + fprintf ff "let %s = Json_conv.get_array %s.Jsonrpc.params in@," arrvn reqvn; + fprintf ff "Json_conv.check_array_with_length %s %d;@," arrvn (List.length params); + let paramsv, venv, _ = + List.fold_left (fun (alist, venv, i) p -> + let a, venv = gen_param ff venv arrvn i p in + (a :: alist), venv, (i + 1) + ) ([], venv, 0) params in + (String.concat " " (List.map (fun v -> name_of_var v) (List.rev paramsv))), venv + ) + in fprintf ff "%s.%s %s@]@," impl_module methname args_str let gen_notification_dispatch ff venv server impl_module nlist = @@ -182,13 +202,20 @@ module Client = struct let args = List.map (fun p -> p.param_name) params in let avlist, venv = Var_env.new_idents_from_names venv ~prefix:"o_" args in let vvlist, venv = Var_env.new_idents_from_names venv ~prefix:"j_" args in - fprintf ff "@,@[let jrpc_%s %s =@," rpc.rpc_request.request_name (String.concat " " (List.map name_of_var avlist)); - List.iter2 (fun p (a, v) -> - fprintf ff "let %s = %s_to_json %s in@," (name_of_var v) p.param_type (name_of_var a) - ) params (List.combine avlist vvlist); let rpcv, venv = Var_env.new_ident_from_name venv "rpc_id" in let rpcvn = name_of_var rpcv in - let args_str = String.concat "; " (List.map name_of_var vvlist) in + let args_str = + (match args with + | [] -> + fprintf ff "@,@[let jrpc_%s () =@," rpc.rpc_request.request_name; + "Json.Null" + | _ -> + fprintf ff "@,@[let jrpc_%s %s =@," rpc.rpc_request.request_name (String.concat " " (List.map name_of_var avlist)); + List.iter2 (fun p (a, v) -> + fprintf ff "let %s = %s_to_json %s in@," (name_of_var v) p.param_type (name_of_var a) + ) params (List.combine avlist vvlist); + String.concat "; " (List.map name_of_var vvlist)) + in (match rpc.rpc_response with | None -> fprintf ff "let %s = None in@," rpcvn | Some _ -> fprintf ff "let %s = Some (%s.get_rpc_request_id ()) in@," rpcvn rpcid_maker); diff --git a/gen/rpc/gen_rpc.ml b/gen/rpc/gen_rpc.ml index fbbec08..a1d18d0 100644 --- a/gen/rpc/gen_rpc.ml +++ b/gen/rpc/gen_rpc.ml @@ -112,7 +112,6 @@ let _ = let input, client, server = parse_args () in try let jdecls = parse_file input in - Printf.printf "%d decls parsed.\n" (List.length jdecls); let decls = List.map process_jdecl jdecls in let spec = Rpc_decl.spec_with_decls decls in Codegen.generate spec client server;