def genCalldesc(decl,eclass,eheader,indent,fqn): assert isinstance(decl, idlast.Operation),repr(decl) name=decl.identifier() nameLen=len(name) pns=['p%s'%i for i in range(1, len(decl.parameters())+1)] params=''.join([',\n %s& %s'%(ptype(p),n) for p,n in zip(decl.parameters(),pns)]) callDescInvocationParams=','.join(['\n cd->%s_'%n for n in pns]) paramInits=''.join([',\n %s_(%s)'%(n,n) for n in pns]) paramMembers=''.join(['\n %s %s_;'%(ptype(p),n) for p,n in zip(decl.parameters(),pns)]) paramMarshals=''.join(['\n cxy::cdr< %s >::marshal(%s_, s);'%(unqualifiedType(p.paramType()),n) for p,n in zip(decl.parameters(),pns)]) returnType=unqualifiedType(decl.returnType()) returnMember='' returnUnmarshal='' callDescReturnValue='' if returnType != 'void': returnMember='\n xju::Optional< %(returnType)s > r_;'%vars() returnUnmarshal='\n r_=cxy::cdr< %(returnType)s >::unmarshalFrom(s);'%vars() callDescReturnValue='\n cd->r_=' pass oneway=0 if decl.oneway(): oneway=1 assert len(decl.contexts())==0, 'contexts not yet implemented' user_exns=''.join(['\n "%s",'%_.repoId() for _ in decl.raises()]) userExceptions=''.join([genCalldescUserException(_) for _ in decl.raises()]) user_exns_size=len(decl.raises()) result=reindent(indent,calldesc_operation_t%vars()) return result
def gen(decl,eclass,eheader,causeType,contextType, causeMemberExpression,contextMemberExpression,indent=''): try: result='' if isinstance(decl, idlast.Module): result=''.join(gen(_,eclass,eheader,causeType,contextType, causeMemberExpression,contextMemberExpression) \ for _ in decl.definitions()) elif isinstance(decl, idlast.Interface): fqn='::'.join(decl.scopedName()) repoId=decl.repoId() result=interface_t%vars()+\ ''.join(gen(_,eclass,eheader,causeType,contextType, causeMemberExpression,contextMemberExpression) \ for _ in decl.contents()) elif isinstance(decl, idlast.Operation): pass elif isinstance(decl, idlast.Typedef): pass elif isinstance(decl, idlast.Struct): name='::'.join(decl.scopedName()) memberTypesAndNames=[(unqualifiedType(_.memberType()),_.declarators()[0].identifier()) for _ in decl.members()]; result=gen_struct(name,memberTypesAndNames) pass elif isinstance(decl, idlast.Exception): name='::'.join(decl.scopedName()) repoId=decl.repoId() memberTypesAndNames=[ (unqualifiedType(_.memberType()),_.declarators()[0].identifier()) \ for _ in decl.members()]; memberTypes=[_[0] for _ in memberTypesAndNames] if causeType in memberTypes and contextType in memberTypes: result=gen_mapped_exception( name,repoId,memberTypesAndNames, eclass,causeType,contextType, causeMemberExpression,contextMemberExpression) else: result=gen_exception(name,repoId,memberTypesAndNames,eclass) pass pass elif isinstance(decl, idlast.Enum): name='::'.join(decl.scopedName()) repoId=decl.repoId() result=enum_t%vars() elif isinstance(decl, idlast.Const): pass elif isinstance(decl, idlast.Union): if decl.switchType().kind()==idltype.tk_enum: result=gen_enum_union(decl) else: result=gen_non_enum_union(decl) pass else: assert False, repr(decl) pass return result except: raise GenerateFailed(decl,sys.exc_info()) pass
def genCalldesc(decl,eclass,eheader,indent,fqn): assert isinstance(decl, idlast.Operation), repr(decl) name=decl.identifier() paramTypes=[unqualifiedType(p.paramType(),eclass) for p in decl.parameters() if p.direction()!=DIRECTION_OUT] pns=['p{n}'.format(**vars()) for n in range(1,len(paramTypes)+1)] paramMembers=''.join(['\n xju::Optional< {t} > {n}_;'.format(**vars()) for t,n in zip(paramTypes,pns)]) paramUnmarshals=''.join( ['\n {n}_=cxy::cdr< {t} >::unmarshalFrom(s);'.format(**vars()) for t,n in zip(paramTypes,pns)]) returnedTypes=opReturnedTypes(decl,eclass) returnType=opReturnType(returnedTypes) returnMember='' returnMarshal='' if returnType != 'void': returnMember= '\n xju::Optional< %(returnType)s > r_;'%vars() returnMarshal='\n cxy::cdr< %(returnType)s >::marshal(r_.value(),s);'%vars() pass assert len(decl.contexts())==0, 'contexts not yet implemented' result=calldesc_t%vars() return result
def gen_non_enum_union(decl,eclass): assert decl.switchType().kind() in basicIntTypes,decl name='::'.join(decl.scopedName()) repoId=decl.repoId() switchTypeName=unqualifiedType(decl.switchType(),eclass) cases=get_union_cases(decl,eclass) labels=[_[0] for _ in cases if not _[0] is None] caseClasses=['V< %(_)s >'%vars() for _ in labels] cases=dict(cases) cases.setdefault(None,[]) #ensure a default case #cases is like {None: [('std::string', 'x_')], 2: [('float', 'c_')], 1: [('int32_t', 'a_')]} unmarshal_cases=''.join([\ gen_union_case_unmarshal(\ name,caseName,cases[label],label) \ for label,caseName in zip(labels,caseClasses)]) marshal_cases=''.join([\ gen_non_enum_union_case_marshal(\ name,caseName,cases[label],switchTypeName,label) \ for label,caseName in zip(labels,caseClasses)]) defaultMemberNames=[_[1] for _ in cases[None]] defaultMemberTypes=[_[0] for _ in cases[None]] defaultParamNames=['p%s'%i for i in range(1,len(cases[None])+1)] defaultMemberUnmarshals=''.join(['\n %(t)s const %(pn)s(cdr< %(t)s >::unmarshalFrom(s));'%vars() for t,pn in zip(defaultMemberTypes,defaultParamNames)]) defaultConsParams=', '.join(['d']+defaultParamNames) defaultMemberMarshals=''.join( ['\n cdr< %(t)s >::marshal(c.%(n)s,s);'%vars() for t,n in zip(defaultMemberTypes,defaultMemberNames)]) return non_enum_union_t%vars()
def gen_enum_union(decl,eclass): name='::'.join(decl.scopedName()) repoId=decl.repoId() switchTypeName='::'.join(decl.switchType().scopedName()) assert decl.switchType().kind()==idltype.tk_enum, decl.switchType() cases=dict([(_.identifier(),[]) for _ in \ decl.switchType().decl().enumerators()]) for c in decl.cases(): assert c.constrType()==False,c for l in c.labels(): assert isinstance(l.value(),idlast.Enumerator),l.value() cases[l.value().identifier()].append( (unqualifiedType(c.caseType(),eclass),#type c.declarator().identifier())) #name pass #cases is like [('A', [('int32_t','a_')]), ('B', [])] ds=dict([(_.identifier(),'::%(switchTypeName)s::'%vars()+_.identifier())\ for _ in decl.switchType().decl().enumerators()]) unmarshal_cases=''.join([\ gen_union_case_unmarshal(\ name,caseName,memberTypesAndNames,ds[caseName]) \ for caseName,memberTypesAndNames in cases.items()]) marshal_cases=''.join([\ gen_union_case_marshal(\ name,caseName,memberTypesAndNames,switchTypeName,ds[caseName]) \ for caseName,memberTypesAndNames in cases.items()]) return union_t%vars()
def genObjref(decl,eclass,eheader,indent,fqn): assert isinstance(decl, idlast.Operation), repr(decl) name=decl.identifier() nameLen=len(name) pns=['p%s'%i for i in range(1, len(decl.parameters())+1)] params=','.join(['\n %s& %s'%(ptype(p),n) for p,n in zip(decl.parameters(),pns)]) paramNames=''.join([',\n %s'%n for n in pns]) assert len(decl.contexts())==0, 'contexts not yet implemented' returnType=unqualifiedType(decl.returnType()) returnValue='' if returnType != 'void': returnValue='\n return c.r_.value();' pass result=reindent(indent,objref_operation_t%vars()) return result
def gen(decl,eclass,eheader,causeType,contextType, causeMemberExpression,contextMemberExpression,indent=''): try: result='' if isinstance(decl, idlast.Module): result=''.join(gen(_,eclass,eheader,causeType,contextType, causeMemberExpression,contextMemberExpression) \ for _ in decl.definitions()) elif isinstance(decl, idlast.Interface): fqn='::'.join(decl.scopedName()) repoId=decl.repoId() result=interface_t%vars()+\ ''.join(gen(_,eclass,eheader,causeType,contextType, causeMemberExpression,contextMemberExpression) \ for _ in decl.contents()) elif isinstance(decl, idlast.Operation): pass elif isinstance(decl, idlast.Typedef): pass elif isinstance(decl, idlast.Struct): repoId=decl.repoId() name='::'.join(decl.scopedName()) memberTypesAndNames=[(unqualifiedType(_.memberType(),eclass),_.declarators()[0].identifier()) for _ in decl.members()]; result=gen_struct(name,memberTypesAndNames,repoId) pass elif isinstance(decl, idlast.Union): repoId=decl.repoId() name='::'.join(decl.scopedName()) switchTypeName=unqualifiedType(decl.switchType(),eclass) cases=get_union_cases(decl,eclass) if decl.switchType().kind()==idltype.tk_enum: #qualify the label (case) values q=decl.switchType().scopedName() cases=[('::'+'::'.join(q+[_[0]]) if not _[0] is None else None, _[1]) for _ in cases] pass result=gen_union(name,switchTypeName,cases,repoId) pass elif isinstance(decl, idlast.Exception): name='::'.join(decl.scopedName()) repoId=decl.repoId() memberTypesAndNames=[ (unqualifiedType(_.memberType(),eclass),_.declarators()[0].identifier()) \ for _ in decl.members()]; memberTypes=[_[0] for _ in memberTypesAndNames] result=gen_exception(name,memberTypesAndNames,repoId) pass elif isinstance(decl, idlast.Enum): name='::'.join(decl.scopedName()) repoId=decl.repoId() values=[_.identifier() for _ in decl.enumerators()] result=gen_enum(name,values,repoId) pass elif isinstance(decl, idlast.Const): pass elif isinstance(decl, idlast.Forward): pass elif isinstance(decl, idlast.StructForward): pass else: assert False, repr(decl) pass return result except: raise GenerateFailed(decl,sys.exc_info()) pass