main.py
来自「编译工具」· Python 代码 · 共 1,130 行 · 第 1/3 页
PY
1,130 行
if ast.shouldGenerateCodeForDecl(decl) \ and not isRecursive(decl) and not type.typedef(): # types declared in the same file will be handled # unless type is recursive -> forward declaration required # unless type is an alias in this file to something in another file return if type.typedef(): if type.type().decl().sizes() != []: visitArray(types.Type(type.type().decl().alias().aliasType()), type.type().decl()) else: type.type().decl().alias().aliasType().accept(self) return mem_name = None d_type = type.deref() if d_type.objref(): mem_name = d_type.objRefTemplate("tcDesc_arg") # make an extern/ forward declaration if isRecursive(decl): forward(decl, mem_name) return external(d_type.type().decl(), mem_name)def visitStringType(type): bound = type.bound() if bound != 0: prefix = config.state['Private Prefix'] n = str(bound) # <--- generated_symbol = prefix + "_buildDesc_c" + n + "string" if isDefined(generated_symbol): return required_symbols = [ prefix + "_buildDesc_c" + "string" ] defineSymbols([ generated_symbol ]) assertDefined(required_symbols) # <--- stream.out(template.bdesc_string, n = n, private_prefix = prefix) def visitWStringType(type): bound = type.bound() if bound != 0: prefix = config.state['Private Prefix'] n = str(bound) # <--- generated_symbol = prefix + "_buildDesc_c" + n + "wstring" if isDefined(generated_symbol): return required_symbols = [ prefix + "_buildDesc_c" + "wstring" ] defineSymbols([ generated_symbol ]) assertDefined(required_symbols) # <--- stream.out(template.bdesc_wstring, n = n, private_prefix = prefix) def visitFixedType(type): prefix = config.state['Private Prefix'] digits = str(type.digits()) scale = str(type.scale()) generated_symbol = prefix + "_buildDesc_c%s_%sfixed" % (digits, scale) if isDefined(generated_symbol): return required_symbols = [ prefix + "_buildDesc_cfixed" ] defineSymbols([ generated_symbol ]) assertDefined(required_symbols) stream.out(template.bdesc_fixed, digits=digits, scale=scale, private_prefix = prefix)def visitSequenceType(type): seqType = types.Type(type.seqType()) d_seqType = seqType.deref() seqType_cname = mangler.canonTypeName(seqType.deref(keep_dims = 1)) sequence_template = types.Type(type).sequenceTemplate() d_type = types.Type(type).deref() memberType_cname = mangler.canonTypeName(d_type) seqType_dims = seqType.dims() is_array = seqType_dims != [] # check if the sequence is recursive is_recursive = isinstance(seqType.type(), idltype.Declared) and \ isRecursive(seqType.type().decl()) seqType.type().accept(self) # something very strange happens here with strings and casting sequence_desc = "((" + sequence_template + "*)_desc->opq_seq)" thing = "(*" + sequence_desc + ")[_index]" if is_array: thing = docast(seqType, None, thing) elementDesc = output.StringStream() prefix = config.state['Private Prefix'] # djr and jnw's "Super-Hacky Optimisation" # (amended by dpg1 to be even more hacky, since char/wchar now don't work) if isinstance(d_seqType.type(), idltype.Base) and \ not d_seqType.variable() and \ not d_seqType.type().kind() in [idltype.tk_char, idltype.tk_wchar] and \ not is_array: elementDesc.out(template.sequence_elementDesc_contiguous, sequence = sequence_desc) else: # <--- required_symbols = [ prefix + "_buildDesc" + seqType_cname ] assertDefined(required_symbols) # <--- elementDesc.out(template.sequence_elementDesc_noncontiguous, private_prefix = prefix, thing_cname = seqType_cname, thing = thing) # <--- cname = memberType_cname # this is the #ifdef guard generated_symbol = prefix + "_tcParser_buildDesc" + cname if isDefined(generated_symbol): return generated_symbols = [ generated_symbol, prefix + "_buildDesc" + cname, prefix + "_tcParser_setElementCount" + cname, prefix + "_tcParser_getElementCount" + cname, prefix + "_tcParser_getElementDesc" + cname ] defineSymbols(generated_symbols) # <--- stream.out(template.anon_sequence, cname = memberType_cname, thing_cname = seqType_cname, sequence_template = sequence_template, elementDesc = str(elementDesc), private_prefix = config.state['Private Prefix'])def canonDims(d): canon = map(lambda x:"_a" + str(x), d) return string.join(canon, "")# We want to treat anonymous arrays (inside structures) the same as typedef# generated ones. However the AST.Declarator node does not have the type# of the declarator, or a pointer to its declaration _unless_ its a typedef# alias. So this is outside the normal tree walking pattern.def visitArray(type, declarator): d_dims = declarator.sizes() d_scopedName = id.Name(declarator.scopedName()) d_cname = mangler.canonTypeName(type, declarator) deref_type = type.deref() deref_kd_type = type.deref(keep_dims = 1) type_dims = type.dims() full_dims = d_dims + type_dims type.type().accept(self) # recursively ensure that dependent type info is available # (if other typedef dimensions are in a different file) if deref_kd_type.typedef(): # must be an array with dimensions decl = deref_kd_type.type().decl() visitArray(types.Type(decl.alias().aliasType()), decl) fqname = d_scopedName.fullyQualify() tc_name = d_scopedName.prefix("_tc_").fullyQualify() guard_name = d_scopedName.guard() # problem with sequences as always # Probably should look into derefKeepDims here if deref_type.sequence() and type.typedef(): alias = type.type().decl().alias() alias_cname = mangler.canonTypeName(types.Type(alias.aliasType())) else: alias_cname = mangler.canonTypeName(deref_type) alias_tyname = type.member() if type.typedef(): alias_tyname = id.Name(type.type().scopedName()).fullyQualify() deref_kd_alias_tyname = deref_kd_type.base() deref_alias_tyname = deref_type.base() if deref_type.objref(): objref_name = deref_type.objRefTemplate("Member") deref_alias_tyname = objref_name if type_dims == []: alias_tyname = objref_name # a multidimensional declarator will create several of # these functions (dimension by dimension) current_dims = [] index = len(d_dims) - 1 # if thing being aliased is also an array declarator, we need # to add its dimensions too. if type.typedef(): current_dims = type.type().decl().sizes() alias_cname = mangler.canonTypeName(types.Type(type.type().decl().alias().aliasType())) prev_cname = canonDims(current_dims) + alias_cname prefix = config.state['Private Prefix'] builddesc_nonarray_str = prefix + "_buildDesc" + alias_cname +\ "(_desc, " + prefix + "_tmp);" required_symbols = [ prefix + "_buildDesc" + alias_cname ] assertDefined(required_symbols) def builddesc_array(cname, prefix = prefix): return """\_desc.p_array.getElementDesc = """ + prefix + """_tcParser_getElementDesc""" + cname + """;_desc.p_array.opq_array = &""" + prefix + """_tmp;""" if type_dims == []: builddesc_str = builddesc_nonarray_str else: builddesc_str = builddesc_array(prev_cname) element_name = alias_tyname if deref_type.string(): if type_dims == []: element_name = "CORBA::String_member" elif deref_type.wstring(): if type_dims == []: element_name = "CORBA::WString_member" elif type.sequence(): element_name = type.sequenceTemplate() elif deref_type.typecode(): if type_dims == []: element_name = "CORBA::TypeCode_member" element_dims = [] while index >= 0: first_iteration = element_dims == [] element_dims = [d_dims[index]] + element_dims current_dims = [d_dims[index]] + current_dims index = index - 1 new_cname = canonDims(element_dims[1:]) + prev_cname builddesc_str = builddesc_array(new_cname) # first iteration, check for special case if first_iteration: if type_dims == []: builddesc_str = builddesc_nonarray_str element_tail_dims = element_dims[1:] dims_index = map(lambda x:"[" + str(x) + "]", element_dims) dims_tail_index = dims_index[1:] this_cname = canonDims(current_dims) + alias_cname generated_symbol = prefix +"_tcParser_getElementDesc"+ this_cname if not isDefined(generated_symbol): defineSymbols([ generated_symbol ]) stream.out(template.getdesc_array, this_cname = this_cname, type = element_name, tail_dims = string.join(dims_tail_index, ""), builddesc = builddesc_str, index_string = string.join(dims_index, ""), private_prefix = prefix) dims_str = map(str, full_dims) dims_index = map(lambda x:"[" + x + "]", dims_str) dims_tail_index = dims_index[1:] tail_dims = string.join(dims_tail_index, "") argtype = deref_alias_tyname if deref_type.sequence(): argtype = deref_type.sequenceTemplate() elif deref_type.typecode(): argtype = "CORBA::TypeCode_member" elif deref_type.string(): argtype = "CORBA::String_member" elif deref_type.wstring(): argtype = "CORBA::WString_member" required_symbols = [ prefix + "_tcParser_getElementDesc" + d_cname ] generated_symbol = prefix + "_buildDesc" + d_cname if not isDefined(generated_symbol): defineSymbols([ generated_symbol ]) assertDefined(required_symbols) stream.out(template.builddesc_array, decl_cname = d_cname, tail_dims = tail_dims, dtype = argtype, type = alias_tyname, private_prefix = prefix)# <-- Code to deal with normal membersdef visitMembers(node, stream, fqname, guard_name, prefix, static = ""): # total up the number of members (enums are a scoping special case) num_members = 0 for m in node.members(): memberType = types.Type(m.memberType()) if memberType.enum() and m.constrType(): num_members = num_members + \ len(memberType.type().decl().enumerators()) for d in m.declarators(): num_members = num_members + 1 # deal with types for m in node.members(): memberType = m.memberType() memberType.accept(self) # needs to deal with array declarators.... for d in m.declarators(): d_sizes = d.sizes() is_array_declarator = d_sizes != [] if is_array_declarator: visitArray(types.Type(memberType), d) # build the case expression cases = output.StringStream() index = 0 for m in node.members(): memberType = types.Type(m.memberType()) deref_memberType = memberType.deref(keep_dims = 1) member_dims = memberType.dims() for d in m.declarators(): d_scopedName = id.Name(d.scopedName()) d_name = d_scopedName.simple() d_cname = mangler.canonTypeName(deref_memberType, d) d_dims = d.sizes() full_dims = d_dims + member_dims is_array = full_dims != [] is_array_declarator = d_dims != [] thing = "((" + fqname + "*)_desc->opq_struct)->" +\ d_name if is_array: thing = docast(memberType, d, thing) assertDefined([ prefix + "_buildDesc" + d_cname ]) cases.out("""\case @n@: @private_prefix@_buildDesc@cname@(_newdesc, @thing@); return 1;""", n = str(index), cname = d_cname, private_prefix = prefix, thing = thing) index = index + 1 stream.out("""\@static@ CORBA::Boolean@private_prefix@_tcParser_getMemberDesc_@guard_name@(const tcStructDesc *_desc, CORBA::ULong _index, tcDescriptor &_newdesc){ switch (_index) { @cases@ default: return 0; };}@static@ CORBA::ULong""", cases = str(cases), private_prefix = prefix, static = static, guard_name = guard_name) defineSymbols([ prefix + "_tcParser_getMemberDesc_" + guard_name ]) # <--- required_symbols = [ prefix + "_tcParser_getMemberDesc_" + guard_name ] generated_symbols = [ prefix + "_tcParser_getMemberCount_" +\ guard_name, prefix + "_buildDesc_c" + guard_name] assertDefined(required_symbols) defineSymbols(generated_symbols) # <---
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?