⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tie.py

📁 编译工具
💻 PY
字号:
# -*- python -*-#                           Package   : omniidl# tie.py                    Created on: 1999/12/13#			    Author    : David Scott (djs)##    Copyright (C) 1999 AT&T Laboratories Cambridge##  This file is part of omniidl.##  omniidl is free software; you can redistribute it and/or modify it#  under the terms of the GNU General Public License as published by#  the Free Software Foundation; either version 2 of the License, or#  (at your option) any later version.##  This program is distributed in the hope that it will be useful,#  but WITHOUT ANY WARRANTY; without even the implied warranty of#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU#  General Public License for more details.##  You should have received a copy of the GNU General Public License#  along with this program; if not, write to the Free Software#  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA#  02111-1307, USA.## Description:##   Produce the 'tie' templates## $Id: tie.py,v 1.13.2.4 2001/06/08 17:12:18 dpg1 Exp $# $Log: tie.py,v $# Revision 1.13.2.4  2001/06/08 17:12:18  dpg1# Merge all the bug fixes from omni3_develop.## Revision 1.13.2.3  2000/11/09 12:27:56  dpg1# Huge merge from omni3_develop, plus full long long from omni3_1_develop.## Revision 1.13.2.2  2000/10/12 15:37:52  sll# Updated from omni3_1_develop.## Revision 1.14.2.2  2000/08/21 11:35:19  djs# Lots of tidying## Revision 1.14.2.1  2000/08/02 10:52:02  dpg1# New omni3_1_develop branch, merged from omni3_develop.## Revision 1.14  2000/07/13 15:26:00  dpg1# Merge from omni3_develop for 3.0 release.## Revision 1.11.2.8  2000/07/17 09:36:40  djs# Now handles the case where an interface inherits from a typedef to another# interface.## Revision 1.11.2.7  2000/06/26 16:24:00  djs# Better handling of #include'd files (via new commandline options)# Refactoring of configuration state mechanism.## Revision 1.11.2.6  2000/06/12 13:22:14  djs# Stopped generation of BOA ties #include'd from other files## Revision 1.11.2.5  2000/06/05 13:03:58  djs# Removed union member name clash (x & pd_x, pd__default, pd__d)# Removed name clash when a sequence is called "pd_seq"# Nested union within union fix# Actually generates BOA non-flattened tie templates## Revision 1.11.2.4  2000/05/31 18:02:58  djs# Better output indenting (and preprocessor directives now correctly output at# the beginning of lines)## Revision 1.11.2.3  2000/04/26 18:22:31  djs# Rewrote type mapping code (now in types.py)# Rewrote identifier handling code (now in id.py)## Revision 1.11.2.2  2000/03/13 16:01:02  djs# Problem generating tie templates with diamond inheritance (duplicated methods# by mistake)## Revision 1.11.2.1  2000/02/14 18:34:54  dpg1# New omniidl merged in.## Revision 1.11  2000/01/20 12:46:40  djs# Renamed a function to avoid a name clash with a module.## Revision 1.10  2000/01/19 11:23:29  djs# Moved most C++ code to template file## Revision 1.9  2000/01/14 11:57:18  djs# Added (flattened) templates missing in BOA generation mode.## Revision 1.8  2000/01/13 14:16:30  djs# Properly clears state between processing separate IDL input files## Revision 1.7  2000/01/11 12:02:41  djs# More tidying up## Revision 1.6  2000/01/10 17:18:15  djs# Removed redundant code.## Revision 1.5  2000/01/10 15:38:56  djs# Better name and scope handling.## Revision 1.4  2000/01/10 11:01:57  djs# Forgot to keep track of names already defined causing a scoping problem.## Revision 1.3  2000/01/07 20:31:29  djs# Regression tests in CVSROOT/testsuite now pass for#   * no backend arguments#   * tie templates#   * flattened tie templates#   * TypeCode and Any generation## Revision 1.2  1999/12/26 16:43:53  djs# Fix for (not) generating tie templates of #included .idl## Revision 1.1  1999/12/14 11:54:43  djs# Restructured generation of tie templates##"""Produce the 'tie' templates"""import stringfrom omniidl import idlast, idltype, idlutil, idlvisitorfrom omniidl_be.cxx import id, config, types, output, astfrom omniidl_be.cxx.header import templateimport tieself = tiedef __init__(stream):    self.stream = stream    return self# Write a single tie template class called <name>, inheriting from <inherits># and grab the operations from <node>def write_template(name, inherits, node, stream,                   Template = template.tie_template):    # build methods which bind the interface operations and attributes    # note that this includes inherited callables since tie    # templates are outside the normal inheritance structure    where = output.StringStream()    # defined_so_far contains keys corresponding to method names which    # have been defined already (and which should not be included twice)    def buildCallables(interface, where, continuation, defined_so_far = {}):        interface = ast.remove_ast_typedefs(interface)                callables = interface.callables()        operations = filter(lambda x:isinstance(x, idlast.Operation),                            callables)        for operation in operations:            returnType = types.Type(operation.returnType())            identifier = operation.identifier()            if (defined_so_far.has_key(identifier)):                # don't repeat it                continue            defined_so_far[identifier] = 1                        parameters = operation.parameters()            has_return_value = not returnType.void()            # FIXME: return types are fully scoped but argument types            # arent?            returnType_name = returnType.op(types.RET)            operation_name = id.mapID(identifier)                        signature = []            call = []            for parameter in parameters:                paramType = types.Type(parameter.paramType())                # Need to call the _impl operation not the _objref operation                param_type_name = paramType.op(types.direction(parameter),                                               use_out = 0)                param_id = id.mapID(parameter.identifier())                signature.append(param_type_name + " " + param_id)                call.append(param_id)            # deal with call contextx            if operation.contexts() != []:                signature.append("CORBA::Context_ptr _ctxt")                call.append("_ctxt")            if has_return_value:                return_str = "return "            else:                return_str = ""                            where.out("""\@return_type_name@ @operation_name@(@signature@) { @return_str@pd_obj->@operation_name@(@call@); }""", return_type_name = returnType_name,                      operation_name = operation_name,                      return_str = return_str,                      signature = string.join(signature, ", "),                      call = string.join(call, ", "))                            attributes = filter(lambda x:isinstance(x, idlast.Attribute),                            callables)        for attribute in attributes:            identifiers = attribute.identifiers()            attrType = types.Type(attribute.attrType())            attrType_name_RET = attrType.op(types.RET)            attrType_name_IN = attrType.op(types.IN)                        for identifier in identifiers:                if defined_so_far.has_key(identifier):                    # don't repeat it                    continue                defined_so_far[identifier] = 1                                ident = id.mapID(identifier)                where.out("""\@attr_type_ret_name@ @attribute_name@() { return pd_obj->@attribute_name@(); }""", attr_type_ret_name = attrType_name_RET,                          attribute_name = ident)                if not attribute.readonly():                    where.out("""\void @attribute_name@(@attr_type_in_name@ _value) { pd_obj->@attribute_name@(_value); }""", attribute_name = ident,                              attr_type_in_name = attrType_name_IN)                            # do the recursive bit        for i in interface.inherits():            continuation(i, where, continuation, defined_so_far)        # done        return    buildCallables(node, where, buildCallables)                    stream.out(Template,               tie_name = name,               inherits = inherits,               callables = str(where))    return# Unflattened BOA tie templates are built in a block out of line.# IDL name       template name#  ::A             ::_tie_A#  ::B             ::_tie_B#  ::M::C          ::_tie_M::Cclass BOATieTemplates(idlvisitor.AstVisitor):    def __init__(self, stream):        self.stream = stream    def visitAST(self, node):        for d in node.declarations():            if ast.shouldGenerateCodeForDecl(d):                d.accept(self)    def visitModule(self, node):        name = id.Name(node.scopedName())                self.stream.out(template.module_begin,                   name = "_tie_" + name.simple())        self.stream.inc_indent()                for d in node.definitions(): d.accept(self)        self.stream.dec_indent()        self.stream.out(template.module_end)            def visitInterface(self, node):        name = id.Name(node.scopedName())        tie_name = name.simple()        if len(node.scopedName()) == 1: tie_name = "_tie_" + tie_name                sk_name = name.prefix("_sk_")                write_template(tie_name, sk_name.fullyQualify(), node, self.stream,                       Template = template.tie_template_old)# Flat Tie Templates are all (by definition) in the global scope,# so can combine POA and BOA code into oneclass FlatTieTemplates(idlvisitor.AstVisitor):    def __init__(self, stream):        self.stream = stream    def visitAST(self, node):        for d in node.declarations():            if ast.shouldGenerateCodeForDecl(d):                d.accept(self)    def visitModule(self, node):        for d in node.definitions():            d.accept(self)    def visitInterface(self, node):        self.generate_POA_tie(node)        if config.state['BOA Skeletons']:            self.generate_BOA_tie(node)    def generate_BOA_tie(self, node):        name = id.Name(node.scopedName())        tie_name = "_tie_" + string.join(name.fullName(), "_")        sk_name = name.prefix("_sk_")        write_template(tie_name, sk_name.fullyQualify(), node, self.stream,                       Template = template.tie_template_old)    def generate_POA_tie(self, node):        name = id.Name(node.scopedName())        tie_name = "POA_" + string.join(name.fullName(), "_") + "_tie"        poa_name = "POA_" + name.fullyQualify()        write_template(tie_name, poa_name, node, self.stream)

⌨️ 快捷键说明

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