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

📄 typecode.py

📁 编译工具
💻 PY
📖 第 1 页 / 共 2 页
字号:
    defineName(mangled_name)        members = node.members()    array = []    for m in members:        memberType = types.Type(m.memberType())        for d in m.declarators():            this_name = id.Name(d.scopedName()).simple()            typecode = mkTypeCode(memberType, d, node)            array.append( "{\"" + this_name + "\", " + typecode + "}" )    if len(members) > 0:        struct.out("""\static CORBA::PR_structMember @mangled_name@[] = {  @members@};""", members = string.join(array, ",\n"), mangled_name = mangled_name)    return struct# Convenience function to total up the number of members, treating# declarators separately.def numMembers(node):    members = node.members()    num = 0    for m in members:        num = num + len(m.declarators())    return num            def visitStruct(node):    startingNode(node)        # the key here is to redirect the bottom half to a buffer    # just for now    oldbottomhalf = self.bottomhalf    self.bottomhalf = output.StringStream()    insideModule = self.__immediatelyInsideModule    self.__immediatelyInsideModule = 0    # create the static typecodes for constructed types by setting    # the resolving_dependency flag and recursing    save_resolving_dependency = self.__resolving_dependency    self.__resolving_dependency = 1        for child in node.members():        memberType = child.memberType()        if isinstance(memberType, idltype.Declared):            memberType.decl().accept(self)        elif isinstance(memberType, idltype.Sequence):            # anonymous sequence (maybe sequence<sequence<...<T>>>)            # Find the ultimate base type, and if it's user declared then            # produce a typecode definition for it.            base_type = memberType.seqType()            while isinstance(base_type, idltype.Sequence):                base_type = base_type.seqType()            # if a struct is recursive, don't loop forever :)            if isinstance(base_type, idltype.Declared):                decl = base_type.decl()                if not currently_being_defined(decl):                    base_type.decl().accept(self)                            self.__resolving_dependency = save_resolving_dependency    tophalf.out(str(buildMembersStructure(node)))    scopedName = node.scopedName()    mangled_name = mangleName(config.state['Private Prefix'] +\                              "_tc_", scopedName)    if not alreadyDefined(mangled_name):        # only define the name once        defineName(mangled_name)            structmember_mangled_name =\                                  mangleName(config.state['Private Prefix'] + \                                             "_structmember_", scopedName)        assert alreadyDefined(structmember_mangled_name), \               "The name \"" + structmember_mangled_name + \               "\" should be defined by now"            num = numMembers(node)        repoID = node.repoId()        struct_name = id.Name(scopedName).simple()        tophalf.out("""\static CORBA::TypeCode_ptr @mangled_name@ = CORBA::TypeCode::PR_struct_tc("@repoID@", "@name@", @structmember_mangled_name@, @n@);""",                    mangled_name = mangled_name,                    structmember_mangled_name = structmember_mangled_name,                    name = struct_name, n = str(num),                    repoID = repoID)           if resolveForward(node):            fwname  = mangleName(config.state['Private Prefix'] +\                                 "_fs_", scopedName)            resname = mangleName(config.state['Private Prefix'] +\                                 "_rf_", scopedName)            tophalf.out("""\static int @resname@ = @fwname@->PR_resolve_forward(@mangled_name@);""",                        fwname=fwname, resname=resname,                        mangled_name=mangled_name)    self.__immediatelyInsideModule = insideModule    external_linkage(node)    # restore the old bottom half    oldbottomhalf.out(str(self.bottomhalf))    self.bottomhalf = oldbottomhalf    finishingNode()    returndef visitStructForward(node):    if (not node.mainFile() and        self.__resolving_dependency and        not currently_being_defined(node)):                startingNode(node)        node.fullDecl().accept(self)        finishingNode()def visitUnion(node):    scopedName = node.scopedName()    mangled_name = mangleName(config.state['Private Prefix'] +\                              "_tc_", scopedName)    if alreadyDefined(mangled_name):        return    startingNode(node)        # the key here is to redirect the bottom half to a buffer    # just for now    oldbottomhalf = self.bottomhalf    self.bottomhalf = output.StringStream()    insideModule = self.__immediatelyInsideModule    self.__immediatelyInsideModule = 0        # need to build a static array of node members in a similar fashion    # to structs    array = []    switchType = types.Type(node.switchType())    deref_switchType = switchType.deref()    if isinstance(switchType.type(), idltype.Declared):        save_resolving_dependency = self.__resolving_dependency        self.__resolving_dependency = 1        switchType.type().decl().accept(self)        self.__resolving_dependency = save_resolving_dependency            numlabels = 0    numcases = 0    hasDefault = None        for c in node.cases():        numcases = numcases + 1        decl = c.declarator()        caseType = types.Type(c.caseType())        save_resolving_dependency = self.__resolving_dependency        self.__resolving_dependency = 1        if isinstance(caseType.type(), idltype.Declared):            caseType.type().decl().accept(self)        elif caseType.sequence():            # anonymous sequence            seqType = caseType.type().seqType()            while isinstance(seqType, idltype.Sequence):                seqType = seqType.seqType()            if isinstance(seqType, idltype.Declared):                # don't loop forever                if not currently_being_defined(seqType.decl()):                    seqType.decl().accept(self)                        self.__resolving_dependency = save_resolving_dependency                typecode = mkTypeCode(caseType, decl, node)        case_name = id.Name(decl.scopedName()).simple()        for l in c.labels():            if l.default():                label = "0"                hasDefault = numlabels            else:                label = switchType.literal(l.value())            array.append( "{\"" + case_name + "\", " + typecode + ", " + label + "}")            numlabels = numlabels + 1    discrim_tc = mkTypeCode(deref_switchType)    repoID = node.repoId()    union_name = id.Name(scopedName).simple()    unionmember_mangled_name = mangleName(config.state['Private Prefix'] + \                                          "_unionMember_", scopedName)        default_str = ""    if hasDefault != None:        default_str = ", " + str(hasDefault)    tophalf.out("""\static CORBA::PR_unionMember @unionmember_mangled_name@[] = {  @members@};static CORBA::TypeCode_ptr @mangled_name@ = CORBA::TypeCode::PR_union_tc("@repoID@", "@name@", @discrim_tc@, @unionmember_mangled_name@, @labels@@default_str@);""",                mangled_name = mangled_name,                repoID = repoID,                discrim_tc = discrim_tc,                unionmember_mangled_name = unionmember_mangled_name,                name = union_name,                labels = str(numlabels),                default_str = default_str,                members = string.join(array, ",\n"))        defineName(unionmember_mangled_name)    defineName(mangled_name)    if resolveForward(node):        fwname  = mangleName(config.state['Private Prefix'] +\                             "_fs_", scopedName)        resname = mangleName(config.state['Private Prefix'] +\                             "_rf_", scopedName)        tophalf.out("""\static int @resname@ = @fwname@->PR_resolve_forward(@mangled_name@);""",                    fwname=fwname, resname=resname,                    mangled_name=mangled_name)        self.__immediatelyInsideModule = insideModule    external_linkage(node)    # restore the old bottom half    oldbottomhalf.out(str(self.bottomhalf))    self.bottomhalf = oldbottomhalf    finishingNode()def visitUnionForward(node):    if (not node.mainFile() and        self.__resolving_dependency and        not currently_being_defined(node)):                startingNode(node)        node.fullDecl().accept(self)        finishingNode()def visitEnum(node):    scopedName = node.scopedName()    mangled_name = mangleName(config.state['Private Prefix'] +\                              "_tc_", scopedName)    if alreadyDefined(mangled_name):        return        enumerators = node.enumerators()    names = []    for enumerator in enumerators:        names.append("\"" + id.Name(enumerator.scopedName()).simple(cxx=0) + "\"")    enum_name = id.Name(scopedName).simple()        repoID = node.repoId()    tc_name = id.Name(scopedName).prefix("_tc_").fullyQualify()    enummember_mangled_name = mangleName(config.state['Private Prefix'] + \                                         "_enumMember_", scopedName)    tophalf.out("""\static const char* @enummember_mangled_name@[] = { @elements@ };static CORBA::TypeCode_ptr @mangled_name@ = CORBA::TypeCode::PR_enum_tc("@repoID@", "@name@", @enummember_mangled_name@, @numcases@);""",                enummember_mangled_name = enummember_mangled_name,                mangled_name = mangled_name,                elements = string.join(names, ", "),                repoID = repoID,                name = enum_name,                numcases = str(len(names)))    defineName(mangled_name)    defineName(enummember_mangled_name)    external_linkage(node)def visitForward(node):    pass    def visitInterface(node):    if node.builtIn(): return    # interfaces containing members with the type of the interface    # cause a minor (non fatal) problem with ordering of the outputted    # declarations. This check only serves to correct this cosmetic flaw    # and make the output of the new system identical to the old one.    if hasattr(node, "already_been_here"):        return    node.already_been_here = 1    startingNode(node)    insideModule = self.__immediatelyInsideModule    self.__immediatelyInsideModule = 0    for n in node.declarations():        n.accept(self)    self.__immediatelyInsideModule = insideModule        repoID = node.repoId()    iname = id.Name(node.scopedName()).simple()    typecode = "CORBA::TypeCode::PR_interface_tc(\"" + repoID + "\", \"" +\               iname + "\")"    node.accept(tcstring)    external_linkage(node, typecode)    finishingNode()def recurse(type):    assert isinstance(type, types.Type)        deref_type = type.deref()    if isinstance(type.type(), idltype.Declared):        base_decl = type.type().decl()        save_resolving_dependency = self.__resolving_dependency        self.__resolving_dependency = 1        base_decl.accept(self)        self.__resolving_dependency = save_resolving_dependency    elif deref_type.sequence():        seqType = deref_type.type().seqType()        if isinstance(seqType, idltype.Declared):            base_decl = seqType.decl()            save_resolving_dependency = self.__resolving_dependency            self.__resolving_dependency = 1            base_decl.accept(self)            self.__resolving_dependency = save_resolving_dependency        elif types.Type(seqType).sequence():            # anonymous sequence            recurse(types.Type(seqType.seqType()))def visitDeclarator(declarator):    # this must be a typedef declarator        node = declarator.alias()    aliasType = types.Type(node.aliasType())    recurse(aliasType)        scopedName = declarator.scopedName()    mangled_name = mangleName(config.state['Private Prefix'] +\                              "_tc_", scopedName)    if alreadyDefined(mangled_name):        return        repoID = declarator.repoId()    typecode = mkTypeCode(aliasType, declarator)    scopedName = declarator.scopedName()    typedef_name = id.Name(scopedName).simple()        tophalf.out("""\static CORBA::TypeCode_ptr @mangled_name@ = CORBA::TypeCode::PR_alias_tc("@repoID@", "@name@", @typecode@);""",                mangled_name = mangled_name,                repoID = repoID,                name = typedef_name,                typecode = typecode)    defineName(mangled_name)    external_linkage(declarator)    def visitTypedef(node):    aliasType = types.Type(node.aliasType())    prefix = "CORBA::TypeCode::PR_"    recurse(aliasType)    for declarator in node.declarators():        declarator.accept(self)        def visitConst(node):    passdef visitException(node):    scopedName = node.scopedName()    mangled_name = mangleName(config.state['Private Prefix'] +\                              "_tc_", scopedName)    if alreadyDefined(mangled_name):        return    defineName(mangled_name)    startingNode(node)        # the key here is to redirect the bottom half to a buffer    # just for now    oldbottomhalf = self.bottomhalf    self.bottomhalf = output.StringStream()    # create the static typecodes for constructed types by setting    # the resolving_dependency flag and recursing    save_resolving_dependency = self.__resolving_dependency    self.__resolving_dependency = 1    insideModule = self.__immediatelyInsideModule    self.__immediatelyInsideModule = 0        for child in node.members():        memberType = child.memberType()        if isinstance(memberType, idltype.Declared):            memberType.decl().accept(self)    self.__resolving_dependency = save_resolving_dependency    self.__immediatelyInsideModule = insideModule        # output the structure of members    tophalf.out(str(buildMembersStructure(node)))        tc_name = id.Name(scopedName).prefix("_tc_").fullyQualify()    num = numMembers(node)    repoID = node.repoId()    ex_name = id.Name(scopedName).simple()    structmember_mangled_name = mangleName(config.state['Private Prefix'] + \                                           "_structmember_", scopedName)    if num == 0:        structmember_mangled_name = "(CORBA::PR_structMember*) 0"    tophalf.out("""\static CORBA::TypeCode_ptr @mangled_name@ = CORBA::TypeCode::PR_exception_tc("@repoID@", "@name@", @structmember_mangled_name@, @n@);""",                mangled_name = mangled_name,                name = ex_name, n = str(num),                structmember_mangled_name = structmember_mangled_name,                repoID = repoID)    external_linkage(node)    # restore the old bottom half    oldbottomhalf.out(str(self.bottomhalf))    self.bottomhalf = oldbottomhalf    finishingNode()

⌨️ 快捷键说明

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