📄 call.py
字号:
n = n + 1 arg_n = "tcd->arg_" + str(n) argtype = types.Type(argument.paramType()) ((h_is_const,h_is_ptr),(s_is_holder,s_is_var)) = \ _arg_info(argtype,argument.direction()) if h_is_ptr: arg_n = "*" + arg_n if s_is_holder and s_is_var: if argument.is_in(): if argument.is_out(): arg_n = arg_n + ".inout()" else: arg_n = arg_n + ".in()" else: arg_n = arg_n + ".out()" impl_args.append(arg_n) if self.__has_return_value: result_string = "tcd->result = " else: result_string = "" if self.__contexts: impl_args.append("ctxt") # If we have no return value and no arguments at all then we don't # need to fetch the call descriptor. This suppresses a warning in gcc # about an unused variable. if result_string != "" or impl_args != []: get_cd = self.__name + "* tcd = (" + self.__name + "*)cd;" else: get_cd = "" impl_call = output.StringStream() catch = output.StringStream() # Deal with context if self.__contexts: impl_call.out(template.interface_callback_context, cname = self.__context_name, count = str(len(self.__contexts))) # Deal with user exceptions raises = self.__exceptions if raises: for exception in raises: ex_scopedName = id.Name(exception.scopedName()) catch.out(template.interface_operation_catch_exn, exname = ex_scopedName.fullyQualify()) impl_call.out(template.interface_callback_tryblock, result = result_string, cxx_operation_name = operation, operation_arguments = string.join(impl_args, ", "), catch = str(catch)) else: impl_call.out(template.interface_callback_invoke, result = result_string, cxx_operation_name = operation, operation_arguments = string.join(impl_args, ", ")) stream.out(template.interface_callback, local_call_descriptor = function_name, get_call_descriptor = get_cd, impl_fqname =interface_name.prefix("_impl_").fullyQualify(), name = interface_name.fullyQualify(), impl_call = str(impl_call)) def out_objrefcall(self,stream,operation,args,localcall_fn,environment): assert isinstance(stream, output.Stream) ctor_args = [ localcall_fn, "\"" + operation + "\"", str(len(operation) + 1) ] assign_args = [] assign_res = [] n = -1 for argument in self.__arguments: n = n + 1 arg_n = "_call_desc.arg_" + str(n) argtype = types.Type(argument.paramType()) ((h_is_const,h_is_ptr),(s_is_holder,s_is_var)) = \ _arg_info(argtype,argument.direction()) if s_is_holder: if argument.is_in(): rvalue = args[n] if argtype.array(): rvalue = "&" + rvalue + "[0]" if h_is_ptr: rvalue = "&(" + argtype.base(environment) + "&) " \ + rvalue assign_args.append(arg_n + " = " + rvalue + ";") else: if s_is_var: arg_n = arg_n + "._retn()" assign_res.append(args[n] + " = " \ + arg_n + ";") else: rvalue = args[n] if argtype.array(): rvalue = "&" + rvalue + "[0]" if h_is_ptr: rvalue = "&(" + argtype.base(environment) + "&) " \ + rvalue assign_args.append(arg_n + " = " + rvalue + ";") if self.__has_return_value: argtype = types.Type(self.__returntype) ((h_is_const,h_is_ptr),(s_is_holder,s_is_var)) = \ _arg_info(argtype,3) if s_is_var: assign_res.append("return _call_desc.result._retn();") else: assign_res.append("return _call_desc.result;") if self.__contexts: assign_context = "_call_desc.ctxt = "\ "CORBA::Context::_duplicate(_ctxt);" else: assign_context = "" stream.out(template.interface_operation, call_descriptor = self.__name, call_desc_args = string.join(ctor_args, ", "), assign_args = string.join(assign_args,"\n"), assign_res = string.join(assign_res,"\n"), assign_context = assign_context) def out_implcall(self,stream,operation,localcall_fn): assert isinstance(stream, output.Stream) ctor_args = [localcall_fn, "\"" + operation + "\"", str(len(operation)+1),str(1) ] prepare_out_args = [] if self.__has_out_args: n = -1 for argument in self.__arguments: n = n + 1 if argument.is_out() and not argument.is_in(): arg_n = "_call_desc.arg_" + str(n) argtype = types.Type(argument.paramType()) ((h_is_const,h_is_ptr),(s_is_holder,s_is_var)) = \ _arg_info(argtype,argument.direction()) if not s_is_holder: rvalue = arg_n + "_" if s_is_var: rvalue = rvalue + ".out()" if h_is_ptr: rvalue = "&" + rvalue prepare_out_args.append(arg_n + " = " + rvalue + ";") # main block of code goes here stream.out(template.interface_operation_dispatch, idl_operation_name = operation, call_descriptor = self.__name, call_desc_args = string.join(ctor_args, ", "), prepare_out_args = string.join(prepare_out_args,"\n")) def __out_declaration(self,stream): # build up the constructor argument list, the initialisation # list and the data members list ctor_args = ["LocalCallFn lcfn", "const char* op_", "size_t oplen", "_CORBA_Boolean upcall=0" ] base_ctor = "omniCallDescriptor(lcfn, op_, oplen, " + \ str(self.__oneway) if self.__exceptions != []: base_ctor = base_ctor + ", _user_exns, " user_exceptions_decl = \ "void userException(cdrStream&,_OMNI_NS(IOP_C)*,const char*);\n"+\ "static const char* const _user_exns[];\n" else: base_ctor = base_ctor + ", 0, " user_exceptions_decl = "" base_ctor = base_ctor + str(len(self.__exceptions)) + ", upcall)" in_arguments_decl = "" out_arguments_decl = "" if self.__has_in_args or self.__contexts: in_arguments_decl = "void marshalArguments(cdrStream&);\n" + \ "void unmarshalArguments(cdrStream&);\n" if self.__has_out_args or self.__has_return_value: out_arguments_decl = \ "void unmarshalReturnedValues(cdrStream&);\n" + \ "void marshalReturnedValues(cdrStream&);\n" data_members = [] n = -1 for argument in self.__arguments: n = n + 1 holder_n = "arg_" + str(n) argtype = types.Type(argument.paramType()) ((h_is_const,h_is_ptr),\ (s_is_holder,s_is_var)) = _arg_info(argtype,argument.direction()) if s_is_var: storage = argtype._var() else: storage = argtype.base() storage_n = holder_n if not s_is_holder: storage_n = storage_n + "_" data_members.append(storage + " " + storage_n + ";") if not s_is_holder: holder = argtype.base() if h_is_const: holder = "const " + holder if argtype.array(): holder = holder + "_slice*" if h_is_ptr: holder = holder + "*" data_members.append(holder + " " + holder_n + ";") if self.__has_return_value: returntype = types.Type(self.__returntype) ((h_is_const,h_is_ptr),\ (s_is_holder,s_is_var)) = _arg_info(returntype,3) holder_n = "result" if s_is_var: storage = returntype._var() else: storage = returntype.base() storage_n = holder_n if not s_is_holder: storage_n = storage_n + "_" data_members.append(storage + " " + storage_n + ";") if self.__contexts: data_members.append("CORBA::Context_var ctxt;"); # Write the proxy class definition stream.out(template.interface_proxy_class, signature = self.__signature, call_descriptor = self.__name, ctor_args = string.join(ctor_args,","), base_ctor = base_ctor, in_arguments_decl = in_arguments_decl, out_arguments_decl = out_arguments_decl, user_exceptions_decl = user_exceptions_decl, member_data = string.join(data_members,"\n")) def __out_contextDescriptor(self,stream): if self.__contexts: contexts = output.StringStream() for context in self.__contexts: contexts.out('"' + context + '",') stream.out(template.interface_context_array, context_descriptor = self.__context_name, contexts = str(contexts)) def __out_marshalArgument(self,stream): if not (self.__has_in_args or self.__contexts): return marshal_block = output.StringStream() self.__out_marshalArgument_shared(marshal_block,1) if self.__contexts: marshal_block.out(template.interface_proxy_marshal_context, name = self.__context_name, count = str(len(self.__contexts))) stream.out(template.interface_proxy_marshal_arguments, call_descriptor = self.__name, marshal_block = marshal_block) def __out_marshalReturnedValues(self,stream): if not (self.__has_out_args or self.__has_return_value): return marshal_block = output.StringStream() if self.__has_return_value: argtype = types.Type(self.__returntype) ((h_is_const,h_is_ptr),(s_is_holder,s_is_var)) = \ _arg_info(argtype,3) argname = "result" if (h_is_ptr): argname = "*" + argname skutil.marshall(marshal_block, None, argtype, None, argname, "_n")
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -