ic_cserver.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 2,101 行 · 第 1/5 页
ERL
2,101 行
"oe_env->_inbuf", 1, caller), %% This is the only malloc call in this file emit(Fd, " OE_MALLOC_SIZE_CHECK(oe_env, oe_malloc_size);\n" " if ((*~s = oe_first = " "malloc(oe_malloc_size)) == NULL) {\n", [N1]), ic_cbe:emit_dealloc_stmts(Fd, " ", AllocedPars), emit(Fd, " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, " "NO_MEMORY, \"Cannot malloc\");\n" " return -1;\n" " }\n"), ParName = "*" ++ N1, % XXX Why not IndOp? NAllocedPars = [ParName| AllocedPars], case ictype:isArray(G, N, T1) of true -> emit_decoding_stmt(G, N, Fd, T1, "(*" ++ IndOp ++ N1 ++ ")", "", "oe_env->_inbuf", 1, "&oe_outindex", array_dyn, NAllocedPars); false -> emit_decoding_stmt(G, N, Fd, T1, "(*" ++ IndOp ++ N1 ++ ")", "", "oe_env->_inbuf", 1, "&oe_outindex", caller_dyn, NAllocedPars) end, emit(Fd, " }\n\n"), NAllocedPars end.%%------------------------------------------------------------%% Emit message encoder%%------------------------------------------------------------emit_message_encoder(G, Fd, N, X, Name, RetType, TypeAttrArgs) -> case ic_forms:is_oneway(X) of false -> %% Encoding operation specific part emit(Fd, "\nint ~s__enc(~s oe_obj", [Name, ic_util:to_undersc(N)]), RType = mk_c_ret_type(G, N, RetType), ParList = mk_par_list_for_encoder(G, N, X, TypeAttrArgs), case ic_util:mk_list(ParList) of "" -> case RType of "void" -> emit(Fd, ", CORBA_Environment *oe_env)\n{"); _ -> emit(Fd, ", ~s oe_return, CORBA_Environment " "*oe_env)\n{", [RType]) end; PLFD -> case RType of "void" -> emit(Fd, ", ~s, CORBA_Environment " "*oe_env)\n{", [PLFD]); _ -> emit(Fd, ", ~s oe_return~s, CORBA_Environment " "*oe_env)\n{", [RType, ", " ++ PLFD]) end end, emit(Fd, "\n"), emit(Fd, " int oe_error_code;\n\n"), UserProto = get_user_proto(G, oe), emit(Fd, " ~s_prepare_reply_encoding(oe_env);\n", [UserProto]), OutTypeAttrArgs = lists:filter(fun({_, out, _}) -> true; ({_, _, _}) -> false end, TypeAttrArgs), OutLength = length(OutTypeAttrArgs), case OutLength > 0 of false -> ic_codegen:nl(Fd); true -> emit(Fd, " oe_ei_encode_tuple_header(oe_env, ~p);\n\n", [OutLength+1]) end, emit_encoding_comment(G, N, Fd, "Encode", "", RetType, "oe_return"), emit_encoding_stmt(G, N, X, Fd, RetType, "oe_return"), foreach(fun({T1, _A1, N1}) -> case T1 of {'void', _} -> ok; _ -> emit_encoding_comment(G, N, Fd, "Encode", "", T1, N1), emit_encoding_stmt(G, N, X, Fd, T1, N1) end end, OutTypeAttrArgs), emit(Fd, " return 0;\n}\n\n"); _ -> %% Oneway ok end.%%------------------------------------------------------------%% Emit message encoder call%%------------------------------------------------------------emit_message_encoder_call(G, Fd, N, X, Name, RetType, TypeAttrArgs) -> emit(Fd, " /* Encoding reply message */\n"), RType = mk_c_ret_type(G, N, RetType), case ic_util:mk_list(mk_enc_par_list(G, N, X, TypeAttrArgs)) of "" -> case RType of "void" -> emit(Fd, " ~s(oe_obj, oe_env);\n", [Name ++ "__enc"]); "erlang_pid*" -> emit(Fd, " ~s(oe_obj, &oe_return, oe_env);\n", [Name ++ "__enc"]); "erlang_port*" -> emit(Fd, " ~s(oe_obj, &oe_return, oe_env);\n", [Name ++ "__enc"]); "erlang_ref*" -> emit(Fd, " ~s(oe_obj, &oe_return, oe_env);\n", [Name ++ "__enc"]); _ -> emit(Fd, " ~s(oe_obj, oe_return, oe_env);\n", [Name ++ "__enc"]) end; PLFE -> case RType of "void" -> emit(Fd, " ~s(oe_obj, ~s, oe_env);\n", [Name ++ "__enc", PLFE]); "erlang_pid*" -> emit(Fd, " ~s(oe_obj, &oe_return, ~s, oe_env);\n", [Name ++ "__enc", PLFE]); "erlang_port*" -> emit(Fd, " ~s(oe_obj, &oe_return, ~s, oe_env);\n", [Name ++ "__enc", PLFE]); "erlang_ref*" -> emit(Fd, " ~s(oe_obj, &oe_return, ~s, oe_env);\n", [Name ++ "__enc", PLFE]); _ -> emit(Fd, " ~s(oe_obj, oe_return, ~s, oe_env);\n", [Name ++ "__enc", PLFE]) end end, ic_codegen:nl(Fd).%%------------------------------------------------------------%% Emit parameter decoding call%%------------------------------------------------------------emit_parameter_decoder_call(G, Fd, N, X, Name, _R, TypeAttrArgs) -> case ic_util:mk_list(mk_dec_par_list(G, N, X, TypeAttrArgs)) of "" -> %% No parameters ! skip it ! ok; PLFDC -> ParDecName = Name ++ "__dec", emit(Fd, " /* Decode parameters */\n" " if((oe_error_code = ~s(oe_obj, ~s, oe_env)) < 0) {\n", [ParDecName, PLFDC]), emit_c_dec_rpt(Fd, " ", "parmeters", []), emit(Fd, " if(oe_env->_major == CORBA_NO_EXCEPTION)\n" " CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, " "BAD_PARAM, \"Bad parameter on decode\");\n" " return oe_error_code;\n }\n\n") end.%%------------------------------------------------------------%% Emit call-back%%------------------------------------------------------------emit_callback(G, Fd, N, X, Name, RetType, TypeAttrArgs) -> CallBackName = Name ++ "__cb", emit(Fd, " /* Callback function call */\n"), PL = ic_util:mk_list(mk_cb_par_list(G, N, X, TypeAttrArgs)), case ic_forms:is_oneway(X) of true -> case PL of "" -> emit(Fd, " oe_restore = ~s(oe_obj, oe_env);\n\n", [CallBackName]); _ -> emit(Fd, " oe_restore = ~s(oe_obj, ~s, oe_env);\n\n", [CallBackName, PL]) end; false -> CBPL = case PL of "" -> ""; _PL -> ", " ++ PL end, case mk_c_ret_type(G, N, RetType) of "void" -> case PL of "" -> emit(Fd, " oe_restore = ~s(oe_obj, oe_env);" "\n\n", [CallBackName]); _ -> emit(Fd, " oe_restore = ~s(oe_obj, ~s, oe_env);" "\n\n", [CallBackName, PL]) end; _ -> case ictype:isArray(G, N, RetType) of true -> emit(Fd, " oe_restore = ~s(oe_obj, oe_return~s, " " oe_env);\n\n", [CallBackName, CBPL]); false -> emit(Fd, " oe_restore = ~s(oe_obj, " "&oe_return~s, oe_env);\n\n", [CallBackName, CBPL]) end end end.%%------------------------------------------------------------%% Emit restore%%------------------------------------------------------------emit_restore(G, Fd, N, X, _Name, RetType, TypeAttrArgs) -> emit(Fd, " /* Restore function call */\n"), emit(Fd, " if (oe_restore != NULL)\n"), PL = ic_util:mk_list(mk_cb_par_list(G, N, X, TypeAttrArgs)), case ic_forms:is_oneway(X) of true -> case PL of "" -> emit(Fd, " (*oe_restore)(oe_obj, oe_env);\n\n"); _ -> emit(Fd, " (*oe_restore)(oe_obj, ~s, oe_env);\n\n", [PL]) end; false -> RPL = case PL of "" -> ""; _PL -> ", " ++ PL end, case mk_c_ret_type(G, N, RetType) of "void" -> case PL of "" -> emit(Fd, " (*oe_restore)(oe_obj, oe_env);" "\n\n"); _ -> emit(Fd, " (*oe_restore)(oe_obj, ~s, oe_env);" "\n\n", [PL]) end; _ -> case ictype:isArray(G, N, RetType) of true -> emit(Fd, " (*oe_restore)(oe_obj, oe_return~s, " " oe_env);\n\n", [RPL]); false -> emit(Fd, " (*oe_restore)(oe_obj, " "&oe_return~s, oe_env);\n\n", [RPL]) end end end.%%------------------------------------------------------------%% Emit variable defs%%------------------------------------------------------------emit_variable_defs(G, Fd, N, X, _Name, RetType, TypeAttrArgs) -> {ScopedName, _, _} = ic_cbe:extract_info(G, N, X), emit(Fd, " ~s__rs* oe_restore = NULL;\n", [ScopedName]), RestVars = mk_var_list(mk_var_decl_list(G, N, X, TypeAttrArgs)), case ic_forms:is_oneway(X) of true -> emit(Fd, "~s\n\n", [RestVars]); false -> RType = mk_c_ret_type(G, N, RetType), case RType of "void" -> emit(Fd, "~s\n\n", [RestVars]); "CORBA_unsigned_long" -> emit(Fd, "~s ~s oe_return = 0;\n\n", [RestVars, RType]); "CORBA_unsigned_long_long" -> emit(Fd, "~s ~s oe_return = 0;\n\n", [RestVars, RType]); "CORBA_unsigned_short" -> emit(Fd, "~s ~s oe_return = 0;\n\n", [RestVars, RType]); "CORBA_short" -> emit(Fd, "~s ~s oe_return = 0;\n\n", [RestVars, RType]); "CORBA_long" -> emit(Fd, "~s ~s oe_return = 0;\n\n", [RestVars, RType]); "CORBA_long_long" -> emit(Fd, "~s ~s oe_return = 0;\n\n", [RestVars, RType]); "CORBA_float" -> emit(Fd, "~s ~s oe_return = 0;\n\n", [RestVars, RType]); "CORBA_double" -> emit(Fd, "~s ~s oe_return = 0;\n\n", [RestVars, RType]); "CORBA_char" -> emit(Fd, "~s ~s oe_return = 0;\n\n", [RestVars, RType]); "CORBA_wchar" -> %% WCHAR emit(Fd, "~s ~s oe_return = 0;\n\n", [RestVars, RType]); "CORBA_boolean" -> emit(Fd, "~s ~s oe_return = 0;\n\n", [RestVars, RType]); "CORBA_octet" -> emit(Fd, "~s ~s oe_return = 0;\n\n", [RestVars, RType]); _ -> case ic_cbe:is_variable_size(G, N, RetType) of true -> emit(Fd, "~s ~s oe_return;\n\n", [RestVars, RType]); false -> TK = ic_forms:get_tk(X), case TK of {tk_enum, _, _, _List} -> emit(Fd, "~s ~s oe_return;\n\n", [RestVars, RType]); _ -> case RType of "erlang_binary*" -> emit(Fd, "~s erlang_binary " "oe_return;\n\n", [RestVars]); "erlang_pid*" -> emit(Fd, "~s erlang_pid " "oe_return;\n\n", [RestVars]); "erlang_port*" -> emit(Fd, "~s erlang_port " "oe_return;\n\n", [RestVars]); "erlang_ref*" -> emit(Fd, "~s erlang_ref " "oe_return;\n\n", [RestVars]); _ -> %% Structures are %% initiated by memset emit(Fd, "~s ~s " "oe_return;\n\n", [RestVars, RType]) end, emit(Fd, " memset(&oe_return, 0, " "sizeof(oe_return));\n\n") end end end end.%%------------------------------------------------------------%% Make variable list%%------------------------------------------------------------%% XXX Modifymk_var_list([]) -> "";mk_var_list([Arg| Args]) -> " " ++ Arg ++ ";\n" ++ mk_var_list(Args).%%------------------------------------------------------------%% Make return type%%------------------------------------------------------------mk_c_ret_type(G, N, Type) -> Ctype = mk_c_type(G, N, Type), Dyn = case ic_cbe:is_variable_size(G, N, Type) of true -> if record(Type, string) -> "*"; Ctype == "CORBA_char *" -> ""; record(Type, wstring) -> %% WSTRING "*"; Ctype == "CORBA_wchar *" -> %% WSTRING ""; true -> case ictype:isArray(G, N, Type) of true -> ""; _ -> "*" end end; false -> if Ctype == "erlang_pid" -> "*"; Ctype == "erlang_port" -> "*"; Ctype == "erlang_ref" -> "*"; true -> "" end end, Ctype ++ Dyn.%%------------------------------------------------------------%% Make call-back parameter list%%------------------------------------------------------------mk_cb_par_list(G, N, X, TypeAttrArgs0) -> TypeAttrArgs1 = filter_type_attr_arg_list(G, X, [in, out], TypeAttrArgs0), lists:map( fun({Type, Attr, Arg}) -> case ic_cbe:is_variable_size(G, N, Type) of true -> case Attr of in -> Arg; out -> case ictype:isArray(G, N, Type) of true -> Arg; _ -> "&" ++ Arg end end; false -> case ictype:isArray(G, N, Type) of
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?