📄 main.py
字号:
fqname=fqname, name=name, element=element, derived=derived) stream.out(template.sequence_forward_defns, fqname=fqname, name=name, element=element)def visitEnum(node): returndef visitMember(node): memberType = node.memberType() if node.constrType(): memberType.decl().accept(self) def visitStruct(node): outer_environment = id.lookup(node) scopedName = id.Name(node.scopedName()) for n in node.members(): n.accept(self) def marshal(stream = stream, node = node, outer_env = outer_environment): for n in node.members(): memberType = types.Type(n.memberType()) for d in n.declarators(): scopedName = id.Name(d.scopedName()) member_name = scopedName.simple() skutil.marshall(stream, outer_env, memberType, d, member_name, "_n") return def unmarshal(stream = stream, node = node, outer_env = outer_environment): for n in node.members(): memberType = types.Type(n.memberType()) for d in n.declarators(): scopedName = id.Name(d.scopedName()) member_name = scopedName.simple() skutil.unmarshall(stream, outer_env, memberType, d, member_name, "_n") return stream.out(template.struct, name = scopedName.fullyQualify(), marshall_code = marshal, unmarshall_code = unmarshal) stream.reset_indent() def visitStructForward(node): passdef visitUnion(node): outer_environment = id.lookup(node) environment = outer_environment.enter(node.identifier()) scopedName = id.Name(node.scopedName()) name = scopedName.fullyQualify() switchType = types.Type(node.switchType()) exhaustive = ast.exhaustiveMatch(switchType, ast.allCaseLabelValues(node)) defaultCase = ast.defaultCase(node) ast.markDefaultCase(node) defaultMember = "" if defaultCase: defaultLabel = ast.defaultLabel(defaultCase) default_scopedName = id.Name(defaultCase.declarator().scopedName()) defaultMember = default_scopedName.simple() hasDefault = defaultCase != None # Booleans are a special case (isn't everything?) booleanWrap = switchType.boolean() and exhaustive # deal with types constructed here if node.constrType(): node.switchType().decl().accept(self) for n in node.cases(): if n.constrType(): n.caseType().decl().accept(self) # -------------------------------------------------------------- # union::operator{>>, <<}= (cdrStream& _n) [const] # # marshal/ unmarshal individual cases marshal_discriminator = output.StringStream() unmarshal_discriminator = output.StringStream() skutil.marshall(marshal_discriminator,environment, switchType, None, "_pd__d", "_n") skutil.unmarshall(unmarshal_discriminator,environment, switchType, None, "_pd__d", "_n") marshal_cases = output.StringStream() unmarshal_cases = output.StringStream() for c in node.cases(): caseType = types.Type(c.caseType()) decl = c.declarator() decl_scopedName = id.Name(decl.scopedName()) decl_name = decl_scopedName.simple() if defaultCase == c: isDefault = 1 else: isDefault = 0 for l in c.labels(): value = l.value() discrim_value = switchType.literal(value, environment) if l.default(): unmarshal_cases.out("default:") else: unmarshal_cases.out("case " + discrim_value + ":") marshal_cases.out("case " + discrim_value + ":") marshal_cases.inc_indent() skutil.marshall(marshal_cases, environment, caseType, decl, "_pd_" + decl_name, "_n") marshal_cases.out("break;") marshal_cases.dec_indent() unmarshal_cases.inc_indent() unmarshal_cases.out("_pd__default = " + str(isDefault) + ";") skutil.unmarshall(unmarshal_cases, environment, caseType, decl, "_pd_" + decl_name, "_n") unmarshal_cases.out("break;") unmarshal_cases.dec_indent() if not hasDefault and not exhaustive: unmarshal_cases.out("""\default: _pd__default = 1; break;""") if booleanWrap: marshal_cases.out(template.union_default_bool) else: marshal_cases.out(template.union_default) def marshal(stream = stream, exhaustive = exhaustive, hasDefault = hasDefault, defaultCase = defaultCase, environment = environment, defaultMember = defaultMember, marshal_cases = marshal_cases): if not exhaustive: def default(stream = stream, exhaustive = exhaustive, hasDefault = hasDefault, defaultCase = defaultCase, environment = environment, defaultMember = defaultMember): if hasDefault: caseType = types.Type(defaultCase.caseType()) decl = defaultCase.declarator() decl_scopedName = id.Name(decl.scopedName()) decl_name = decl_scopedName.simple() skutil.marshall(stream, environment, caseType, decl, "_pd_" + decl_name, "_n") stream.out(template.union_operators_nonexhaustive, default = default, cases = str(marshal_cases)) else: stream.out(template.union_operators_exhaustive, cases = str(marshal_cases)) # write the operators stream.out(template.union_operators, name = name, marshal_discriminator = str(marshal_discriminator), unmarshal_discriminator = str(unmarshal_discriminator), marshal_cases = marshal, unmarshal_cases = str(unmarshal_cases)) return def visitUnionForward(node): pass def visitForward(node): returndef visitConst(node): environment = id.lookup(node) constType = types.Type(node.constType()) d_constType = constType.deref() if d_constType.string(): type_string = "char *" elif d_constType.wstring(): type_string = "CORBA::WChar *" elif d_constType.fixed(): type_string = constType.base() else: type_string = d_constType.base() scopedName = id.Name(node.scopedName()) name = scopedName.fullyQualify() value = d_constType.literal(node.value(), environment) init_in_def = d_constType.representable_by_int() if init_in_def: if self.__insideInterface: stream.out(template.const_in_interface, type = type_string, name = name, value = value) else: stream.out(template.const_init_in_def, type = type_string, name = name, value = value) return # not init_in_def if self.__insideModule and not self.__insideInterface: scopedName = node.scopedName() scopedName = map(id.mapID, scopedName) open_namespace = "" close_namespace = "" for s in scopedName[:-1]: open_namespace = open_namespace + "namespace " + s + " { " close_namespace = close_namespace + "} " simple_name = scopedName[-1] stream.out(template.const_namespace, open_namespace = open_namespace, close_namespace = close_namespace, type = type_string, simple_name = simple_name, name = name, value = value) else: stream.out(template.const_simple, type = type_string, name = name, value = value) passdef visitDeclarator(node): passdef visitException(node): scopedName = id.Name(node.scopedName()) name = scopedName.simple() cxx_name = id.mapID(name) outer_environment = id.lookup(node) environment = outer_environment.enter(name) scoped_name = scopedName.fullyQualify() # build the default ctor, copy ctor, assignment operator copy_ctor_body = output.StringStream() default_ctor_body = output.StringStream() default_ctor_args = [] assign_op_body = output.StringStream() has_default_ctor = 0 for m in node.members(): has_default_ctor = 1 memberType = types.Type(m.memberType()) if m.constrType(): memberType.type().decl().accept(self) d_memberType = memberType.deref() memberType_fqname = memberType.base() for d in m.declarators(): decl_scopedName = id.Name(d.scopedName()) decl_name = decl_scopedName.simple() decl_dims = d.sizes() full_dims = decl_dims + memberType.dims() is_array = full_dims != [] is_array_declarator = decl_dims != [] memberType_name_arg = memberType.op(types.IN, environment) if is_array_declarator: # we use the internal typedef'ed type if the member is an array # declarator memberType_name_arg = "const " +\ config.state['Private Prefix'] +\ "_" + decl_name elif d_memberType.sequence(): if memberType.typedef(): memberType_name_arg = "const " + id.Name(memberType.type().decl().scopedName()).unambiguous(environment) else: memberType_name_arg = "const " + memberType.sequenceTemplate(environment) elif memberType.typecode(): memberType_name_arg = "CORBA::TypeCode_ptr" index = "" if is_array: blocks = [cxx.Block(copy_ctor_body), cxx.Block(default_ctor_body), cxx.Block(assign_op_body)] loops = [cxx.For(copy_ctor_body, full_dims), cxx.For(default_ctor_body, full_dims), cxx.For(assign_op_body, full_dims)] index = loops[0].index() # all the same copy_ctor_body.out("""\@member_name@@index@ = _s.@member_name@@index@;""", member_name = decl_name, index = index) if d_memberType.objref() and not is_array: # these are special resources which need to be explicitly # duplicated (but not if an array?) duplicate = string.replace(memberType_fqname,"_ptr","") + \ "::_duplicate" if isinstance(d_memberType.type().decl(),idlast.Forward): duplicate = string.replace(duplicate,"::_dup",\ "_Helper::dup") default_ctor_body.out("""\@duplicate@(_@member_name@@index@);""", duplicate = duplicate, member_name = decl_name, index = index) default_ctor_args.append(memberType_name_arg + " _" + decl_name) default_ctor_body.out("""\@member_name@@index@ = _@member_name@@index@;""", member_name = decl_name, index = index) assign_op_body.out("""\@member_name@@index@ = _s.@member_name@@index@;""", member_name = decl_name, index = index) if is_array: for loop in loops: loop.end() for block in blocks: block.end() default_ctor = output.StringStream() if has_default_ctor: default_ctor.out(template.exception_default_ctor, scoped_name = scoped_name, name = name, ctor_args = string.join(default_ctor_args, ", "), default_ctor_body = str(default_ctor_body)) # write the main chunk stream.out(template.exception, scoped_name = scoped_name, name = name, copy_ctor_body = str(copy_ctor_body), default_ctor = str(default_ctor), ctor_args = string.join(default_ctor_args, ", "), default_ctor_body = str(default_ctor_body), repoID = node.repoId(), assign_op_body = str(assign_op_body)) # deal with marshalling and demarshalling needs_marshalling = node.members() != [] marshal = output.StringStream() unmarshal = output.StringStream() for m in node.members(): memberType = types.Type(m.memberType()) d_memberType = memberType.deref() for d in m.declarators(): decl_scopedName = id.Name(d.scopedName()) decl_name = decl_scopedName.simple() is_array_declarator = d.sizes() != [] skutil.unmarshall(unmarshal, environment, memberType, d, decl_name, "_n") skutil.marshall(marshal, environment, memberType, d, decl_name, "_n") if needs_marshalling: stream.out(template.exception_operators, scoped_name = scoped_name, marshal = str(marshal), unmarshal = str(unmarshal)) return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -