ic_jbe.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 1,486 行 · 第 1/4 页

ERL
1,486
字号
	true ->	    ic_codegen:emit(Fd, "          ~s ~s = __is~s;  // In value\n",			    [ic_java_type:getType(G,N,Type),			     Arg,			     ic_java_type:unMarshalFun(G,N,X,Type)]); 	false -> 	    ic_codegen:emit(Fd, "          ~s ~s = ~s.unmarshal(__is);  // In value\n",			    [ic_java_type:getType(G,N,Type), 			     Arg, 			     ic_java_type:getUnmarshalType(G,N,X,Type)])    end,    emit_server_unmarshal_loop(G, N, X, Types, Args, Counter+1, Fd);emit_server_unmarshal_loop(G, N, X, [Type|Types],[{inout, Arg}|Args], Counter, Fd) ->     Holder = ic_java_type:getHolderType(G,N,Type),    case ic_java_type:isBasicType(G,N,Type) of	true ->%	    OtpEncVar = ic_java_type:getUnmarshalType(G,N,X,Type),	    ic_codegen:emit(Fd, "          ~s _~s = __is~s;\n",			    [ic_java_type:getType(G,N,Type),			     Arg,			     ic_java_type:unMarshalFun(G,N,X,Type)]),	    ic_codegen:emit(Fd, "          ~s ~s = new ~s(_~s);  // InOut value\n",			    [Holder, 			     Arg, 			     Holder,			     Arg]);	false ->	    ic_codegen:emit(Fd, "          ~s ~s = new ~s();  // InOut value\n",			    [Holder, 			     Arg, 			     Holder]),	    ic_codegen:emit(Fd, "          ~s._unmarshal(__is);\n",			    [Arg])    end,    emit_server_unmarshal_loop(G, N, X, Types, Args, Counter+1, Fd);emit_server_unmarshal_loop(G, N, X, [Type|Types],[{out, Arg}|Args], Counter, Fd) ->    Holder = ic_java_type:getHolderType(G,N,Type),    ic_codegen:emit(Fd, "          ~s ~s = new ~s();  // Out value\n", [Holder, Arg, Holder]),    emit_server_unmarshal_loop(G, N, X, Types, Args, Counter, Fd).emit_server_marshal_loop(_,_,_,_,[],_,_Fd) ->    ok;emit_server_marshal_loop(G, N, X, [_Type|Types],[{in, _Arg}|Args], Counter, Fd) ->    emit_server_marshal_loop(G, N, X, Types, Args, Counter, Fd);emit_server_marshal_loop(G, N, X, [Type|Types],[{_, Arg}|Args], Counter, Fd) -> %    Holder = ic_java_type:getHolderType(G,N,Type),    case ic_java_type:isBasicType(G,N,Type) of	true ->	    ic_codegen:emit(Fd, "          __os~s(~s.value);  // Out/InOut value\n", 			    [ic_java_type:marshalFun(G,N,X,Type),Arg]);	false ->	    ic_codegen:emit(Fd, "          ~s._marshal(__os);  // Out/InOut value\n", 			    [Arg])    end,    emit_server_marshal_loop(G, N, X, Types, Args, Counter+1, Fd).%%%----------------------------------------------------%%%%%%   Utilities%%%%%%----------------------------------------------------extract_info(_G, N, X) when record(X, op) ->    Name	=  ic_util:to_undersc([ic_forms:get_id2(X) | N]),    Args	= X#op.params,    ArgNames	= mk_c_vars(Args),    TypeList	= {ic_forms:get_type(X),		   lists:map(fun(Y) -> ic_forms:get_type(Y) end, Args),		   []		  },    {Name, ArgNames, TypeList};extract_info(_G, N, X) ->    Name	=  ic_util:to_undersc([ic_forms:get_id2(X) | N]),    {Name, [], []}.%% Input is a list of parameters (in parse form) and output is a list%% of parameter attribute and variable names.mk_c_vars(Params) ->    lists:map(fun(P) -> {A, _} = P#param.inout,			{A, ic_forms:get_id(P#param.id)}	      end,	      Params).%%handle_preproc(G, _N, line_nr, X) ->    Id = ic_forms:get_java_id(X),    Flags = X#preproc.aux,    case Flags of	[] -> ic_genobj:push_file(G, Id);	_ ->	    lists:foldr(fun({_, _, "1"}, Gprim) -> ic_genobj:push_file(Gprim, Id);			   ({_, _, "2"}, Gprim) -> ic_genobj:pop_file(Gprim, Id);			   ({_, _, "3"}, Gprim) -> ic_genobj:sys_file(Gprim, Id) end,			G, Flags)    end;handle_preproc(G, _N, _Other, _X) ->    G.%%gen_par_list(_, _, _, [], []) ->    [];gen_par_list(G, N, X, [Type |Types], [{Attr, Arg}|Args]) ->    JType = ic_java_type:getParamType(G, N, Type, Attr),    [JType ++ " " ++ Arg |      gen_par_list(G, N, X, Types, Args)].gen_marshal_par_list(_, _, _, [], []) ->    [];gen_marshal_par_list(G, N, X, [_Type |Types], [{out, _Arg}|Args]) ->    gen_marshal_par_list(G, N, X, Types, Args);gen_marshal_par_list(G, N, X, [Type |Types], [{Attr, Arg}|Args]) ->    JType = ic_java_type:getParamType(G, N, Type, Attr),    [JType ++ " " ++ Arg |      gen_marshal_par_list(G, N, X, Types, Args)].gen_unmarshal_par_list(_, _, _, [], []) ->    [];gen_unmarshal_par_list(G, N, X, [_Type |Types], [{in, _Arg}|Args]) ->    gen_unmarshal_par_list(G, N, X, Types, Args);gen_unmarshal_par_list(G, N, X, [Type |Types], [{Attr, Arg}|Args]) ->    JType = ic_java_type:getParamType(G, N, Type, Attr),    [JType ++ " " ++ Arg |      gen_unmarshal_par_list(G, N, X, Types, Args)].%%gen_client_marshal_call_par_list([]) ->    [];gen_client_marshal_call_par_list([{out, _Arg}|Args]) ->    gen_client_marshal_call_par_list(Args);gen_client_marshal_call_par_list([{_Attr, Arg}|Args]) ->    [Arg | gen_client_marshal_call_par_list(Args)].gen_client_unmarshal_call_par_list([]) ->    [];gen_client_unmarshal_call_par_list([{in, _Arg}|Args]) ->    gen_client_unmarshal_call_par_list(Args);gen_client_unmarshal_call_par_list([{_Attr, Arg}|Args]) ->    [Arg | gen_client_unmarshal_call_par_list(Args)].count_client_receive(ArgNames) ->    count_client_receive(ArgNames,0).count_client_receive([],C) ->    C;count_client_receive([{in, _Arg}|Args],C) ->    count_client_receive(Args,C);count_client_receive([_|Args],C) ->    count_client_receive(Args,C+1).count_client_send(ArgNames) ->    count_client_send(ArgNames,0).count_client_send([],C) ->    C;count_client_send([{out, _Arg}|Args],C) ->    count_client_send(Args,C);count_client_send([_|Args],C) ->    count_client_send(Args,C+1).gen_cb_arg_list([]) ->    [];gen_cb_arg_list([{_Attr, Arg}|Args]) ->    [Arg | gen_cb_arg_list(Args)].count_server_receive(ArgNames) ->    count_server_receive(ArgNames,0).count_server_receive([],C) ->    C;count_server_receive([_|Args],C) ->    count_server_receive(Args,C+1).count_server_send(ArgNames) ->    count_server_send(ArgNames,0).count_server_send([],C) ->    C;count_server_send([{in, _Arg}|Args],C) ->    count_server_send(Args,C);count_server_send([_|Args],C) ->    count_server_send(Args,C+1).%%%-------------------------------------------------------emit_type_function(G, N, X, Fd) ->    TC = ic_forms:get_type_code(G, N, X),    %%io:format("X = ~p\nTC = ~p\n",[X,TC]),    ic_codegen:emit(Fd, "   private static ~sTypeCode _tc;\n",[?ICPACKAGE]),    ic_codegen:emit(Fd, "   synchronized public static ~sTypeCode type() {\n\n",[?ICPACKAGE]),    ic_codegen:emit(Fd, "     if (_tc != null)\n"),    ic_codegen:emit(Fd, "       return _tc;\n\n"),    emit_type_function(TC, 0, Fd),        ic_codegen:emit(Fd, "\n     _tc = _tc0;\n"),    ic_codegen:emit(Fd, "\n     return _tc0;\n"),    ic_codegen:emit(Fd, "   }\n\n").    	emit_type_function({tk_struct, ID, Name, ML}, C, Fd) -> %% struct    ic_codegen:emit(Fd, "     ~sTypeCode _tc~p =\n",[?ICPACKAGE,C]),    ic_codegen:emit(Fd, "       new ~sTypeCode();\n", [?ICPACKAGE]),    ic_codegen:emit(Fd, "     _tc~p.kind(~sTCKind.tk_struct);\n", [C,?ICPACKAGE]),    ic_codegen:emit(Fd, "     _tc~p.id(~p);\n", [C,ID]),    ic_codegen:emit(Fd, "     _tc~p.name(~p);\n", [C,Name]),    ic_codegen:emit(Fd, "     _tc~p.member_count(~p);\n", [C,length(ML)]),    emit_struct_members(ML, C, C+1, 0, Fd);emit_type_function({tk_enum, ID, Name, MNames}, C, Fd) -> %% enum    ic_codegen:emit(Fd, "     ~sTypeCode _tc~p =\n",[?ICPACKAGE,C]),    ic_codegen:emit(Fd, "       new ~sTypeCode();\n", [?ICPACKAGE]),    ic_codegen:emit(Fd, "     _tc~p.kind(~sTCKind.tk_enum);\n", [C,?ICPACKAGE]),    ic_codegen:emit(Fd, "     _tc~p.id(~p);\n", [C,ID]),    ic_codegen:emit(Fd, "     _tc~p.name(~p);\n", [C,Name]),    ic_codegen:emit(Fd, "     _tc~p.member_count(~p);\n", [C,length(MNames)]),    emit_enum_members(MNames, C, 0, Fd),    C+1;emit_type_function({tk_array, ET, L}, C, Fd) -> %% array    ic_codegen:emit(Fd, "     ~sTypeCode _tc~p =\n",[?ICPACKAGE,C]),    ic_codegen:emit(Fd, "       new ~sTypeCode();\n", [?ICPACKAGE]),    ic_codegen:emit(Fd, "     _tc~p.kind(~sTCKind.tk_array);\n", [C,?ICPACKAGE]),    ic_codegen:emit(Fd, "     _tc~p.id(id());\n",[C]),    ic_codegen:emit(Fd, "     _tc~p.length(~p);\n", [C,L]),    C1 = C+1,    C2 = emit_type_function(ET, C1, Fd),    ic_codegen:emit(Fd, "     _tc~p.content_type(_tc~p);\n", [C,C1]),    C2;emit_type_function({tk_sequence, ET, L}, C, Fd) -> %% sequence     ic_codegen:emit(Fd, "     ~sTypeCode _tc~p =\n",[?ICPACKAGE,C]),    ic_codegen:emit(Fd, "       new ~sTypeCode();\n", [?ICPACKAGE]),    ic_codegen:emit(Fd, "     _tc~p.kind(~sTCKind.tk_sequence);\n", [C,?ICPACKAGE]),    ic_codegen:emit(Fd, "     _tc~p.id(id());\n",[C]),    ic_codegen:emit(Fd, "     _tc~p.length(~p);\n", [C,L]),    C1 = C+1,    C2 = emit_type_function(ET, C1, Fd),    ic_codegen:emit(Fd, "     _tc~p.content_type(_tc~p);\n", [C,C1]),    C2;emit_type_function({tk_string, L}, C, Fd) -> %% string    ic_codegen:emit(Fd, "     ~sTypeCode _tc~p =\n",[?ICPACKAGE,C]),    ic_codegen:emit(Fd, "       new ~sTypeCode();\n", [?ICPACKAGE]),    ic_codegen:emit(Fd, "     _tc~p.kind(~sTCKind.tk_string);\n", [C,?ICPACKAGE]),    ic_codegen:emit(Fd, "     _tc~p.length(~p);\n", [C,L]),    C+1;	     emit_type_function({tk_union, ID, Name, DT, DI, LL}, C, Fd) -> %% union        ic_codegen:emit(Fd, "     ~sTypeCode _tc~p =\n",[?ICPACKAGE,C]),    ic_codegen:emit(Fd, "       new ~sTypeCode();\n", [?ICPACKAGE]),    ic_codegen:emit(Fd, "     _tc~p.kind(~sTCKind.tk_union);\n", [C,?ICPACKAGE]),    ic_codegen:emit(Fd, "     _tc~p.id(~p);\n", [C,ID]),    ic_codegen:emit(Fd, "     _tc~p.name(~p);\n", [C,Name]),        C1 = C+1,    C2 = emit_type_function(DT, C1, Fd),    ic_codegen:emit(Fd, "     _tc~p.discriminator_type(_tc~p);\n", [C,C1]),    ic_codegen:emit(Fd, "     _tc~p.default_index(~p);\n", [C,DI]),    ic_codegen:emit(Fd, "     _tc~p.member_count(~p);\n", [C,length(LL)]),    emit_union_labels(LL, C, DT, C2, 0, Fd);emit_type_function(tk_term, C, Fd) -> %% term, must change it to tk_any    ic_codegen:emit(Fd, "     ~sTypeCode _tc~p =\n",[?ICPACKAGE,C]),    ic_codegen:emit(Fd, "       new ~sTypeCode();\n", [?ICPACKAGE]),    ic_codegen:emit(Fd, "     _tc~p.kind(~sTCKind.tk_any);\n", [C,?ICPACKAGE]),    C+1;emit_type_function(TC, C, Fd) -> %% other     ic_codegen:emit(Fd, "     ~sTypeCode _tc~p =\n",[?ICPACKAGE,C]),    ic_codegen:emit(Fd, "       new ~sTypeCode();\n", [?ICPACKAGE]),    ic_codegen:emit(Fd, "     _tc~p.kind(~sTCKind.~p);\n", [C,?ICPACKAGE,TC]),    C+1.emit_struct_members([], _, TCtr, _, _Fd) ->     TCtr;emit_struct_members([{Name,MT}|Rest], BTCtr, TCtr, I, Fd) ->    ic_codegen:emit(Fd, "     _tc~p.member_name(~p,~p);\n", [BTCtr,I,Name]),    TCtr2 = emit_type_function(MT, TCtr, Fd),    ic_codegen:emit(Fd, "     _tc~p.member_type(~p,_tc~p);\n", [BTCtr,I,TCtr]),    emit_struct_members(Rest, BTCtr, TCtr2, I+1, Fd).emit_enum_members([], _, _, _Fd) ->     ok;emit_enum_members([Name|Names], BTCtr, I, Fd) ->    ic_codegen:emit(Fd, "     _tc~p.member_name(~p,~p);\n", [BTCtr,I,Name]),    emit_enum_members(Names, BTCtr, I+1, Fd).emit_union_labels([], _, _, TCtr, _, _) ->     TCtr;emit_union_labels([{L, LN, LT}|Rest], BTCtr, DT, TCtr, I, Fd) ->    ic_codegen:emit(Fd, "     ~sAny _any~p =\n",[?ICPACKAGE,TCtr]),    ic_codegen:emit(Fd, "       new ~sAny();\n", [?ICPACKAGE]),    TCtr1 = TCtr+1,    TCtr2 = emit_type_function(LT, TCtr1,Fd),    ic_codegen:emit(Fd, "     _any~p.type(_tc~p);\n",[TCtr,TCtr1]),    case L of	default ->	    ic_codegen:emit(Fd, "     _any~p.insert_atom(\"default\");\n", [TCtr]);	_ ->	    case DT of		tk_boolean ->		    ic_codegen:emit(Fd, "     _any~p.insert_boolean(~p);\n",[TCtr,L]);		tk_char ->		    Default = if integer(L) ->				      [L];				 true ->				      L			      end,		    ic_codegen:emit(Fd, "     _any~p.insert_char('~s');\n",[TCtr,Default]);		tk_ushort ->		    ic_codegen:emit(Fd, "     _any~p.insert_ushort(~p);\n",[TCtr,L]);		tk_ulong ->		    ic_codegen:emit(Fd, "     _any~p.insert_ulong(~p);\n",[TCtr,L]);		tk_short ->		    ic_codegen:emit(Fd, "     _any~p.insert_short(~p);\n",[TCtr,L]);		tk_long ->		    ic_codegen:emit(Fd, "     _any~p.insert_long(~p);\n",[TCtr,L]);		_ ->		    ic_codegen:emit(Fd, "     _any~p.insert_string(~p);\n", [TCtr,L])	    end    end,    ic_codegen:emit(Fd, "     _tc~p.member_label(~p,_any~p);\n", [BTCtr,I,TCtr]),    ic_codegen:emit(Fd, "     _tc~p.member_name(~p,~p);\n", [BTCtr,I,LN]),    TCtr3 = emit_type_function(LT, TCtr2, Fd),    ic_codegen:emit(Fd, "     _tc~p.member_type(~p,_tc~p);\n", [BTCtr,I,TCtr2]),    emit_union_labels(Rest, BTCtr, DT, TCtr3, I+1, Fd).

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?