📄 typecode.py
字号:
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 + -