Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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()
Exemplo n.º 5
0
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()
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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