Пример #1
0
    def typeName(type):
        assert isinstance(type, types.Type)
        d_type = type.deref()
        # dereference the type, until just -before- it becomes a
        # sequence. Since a sequence doesn't have a scopedName(),
        # we use the scopedName() of the immediately preceeding
        # typedef which is an instance of idltype.Declared
        while type.typedef() and \
              not types.Type(type.type().decl().alias().aliasType()).sequence():
            type = types.Type(type.type().decl().alias().aliasType())

        if name_map.has_key(type.type().kind()):
            return name_map[type.type().kind()]
        if type.string():
            bound = ""
            if type.type().bound() != 0:
                bound = str(type.type().bound())
            return bound + "string"
        if type.wstring():
            bound = ""
            if type.type().bound() != 0:
                bound = str(type.type().bound())
            return bound + "wstring"

        if isinstance(type.type(), idltype.Fixed):
            return str(type.type().digits()) + "_" + \
                   str(type.type().scale()) + "fixed"

        if isinstance(type.type(), idltype.Declared):
            return id.Name(type.type().scopedName()).guard()

        util.fatalError("Error generating mangled name")
Пример #2
0
def recurse(type, constr=0):
    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
        if not constr:
            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()))
Пример #3
0
def visitTypedef(node):
    aliasType = types.Type(node.aliasType())
    d_type = aliasType.deref()

    if node.constrType():
        aliasType.type().decl().accept(self)

    for d in node.declarators():
        scopedName = id.Name(d.scopedName())
        
        if d_type.sequence() and not aliasType.typedef():
            seqType = types.Type(d_type.type().seqType())
            d_seqType = seqType.deref()

            if d_seqType.structforward() or d_seqType.unionforward():
                fqname  = scopedName.fullyQualify()
                name    = id.mapID(d.identifier())
                element = d_seqType.base()
                bound   = d_type.type().bound()
                derived = d_type.sequenceTemplate()
                
                if bound > 0:
                    stream.out(template.sequence_forward_bounded_defns,
                               bound=bound, fqname=fqname, name=name,
                               element=element, derived=derived)
                else:
                    stream.out(template.sequence_forward_unbounded_defns,
                               fqname=fqname, name=name,
                               element=element, derived=derived)

                stream.out(template.sequence_forward_defns,
                           fqname=fqname, name=name, element=element)
Пример #4
0
    def out_ami_poller(self, stream, ami_method, poller_method, cd_names):
        assign_res = []
        ami_args       = iter(poller_method.arg_names())
        timeout_arg    = next(ami_args)

        if self.__has_return_value:
            argtype = types.Type(self.__returntype)
            (h_is_const,h_is_ptr),(s_is_holder,s_is_var) = _arg_info(argtype, 3)

            if s_is_var:
                assign_res.append("%s = _call_desc->result._retn();" %
                                  next(ami_args))
            else:
                assign_res.append("%s = _call_desc->result;" %
                                  next(ami_args)) 


        for n, argument in enumerate(self.__arguments):
            if not argument.is_out():
                continue

            arg_ident = next(ami_args)
            arg_n     = "_call_desc->arg_%d" % n

            argtype = types.Type(argument.paramType())
            ((h_is_const,h_is_ptr),(s_is_holder,s_is_var)) = \
                         _arg_info(argtype,argument.direction())

            if s_is_holder:
                if s_is_var:
                    assign_res.append("%s = %s._retn();" % (arg_ident, arg_n))
                else:
                    assign_res.append("%s = %s;" % (arg_ident, arg_n))

            else:
                if s_is_var:
                    assign_res.append("%s = %s_._retn();" % (arg_ident, arg_n))

                else:
                    if argtype.array():
                        assign_res.append("%s_copy(%s, %s_);" %
                                          (argtype.base(), arg_ident, arg_n))
                    else:
                        assign_res.append("%s = %s_;" % (arg_ident, arg_n))

        if assign_res:
            tmpl = template.interface_ami_poller_method
        else:
            tmpl = template.interface_ami_poller_method_empty
            
        stream.out(tmpl,
                   cd_name_c   = cd_names[0],
                   cd_name_p   = cd_names[1],
                   timeout_arg = timeout_arg,
                   assign_res  = "\n".join(assign_res))
Пример #5
0
def visitTypedef(node):
    environment = id.lookup(node)
    is_global_scope = not (self.__insideModule or self.__insideInterface)

    aliasType = types.Type(node.aliasType())
    d_type = aliasType.deref()

    if node.constrType():
        aliasType.type().decl().accept(self)

    fq_aliased = aliasType.base(environment)

    for d in node.declarators():
        scopedName = id.Name(d.scopedName())

        decl_dims = d.sizes()
        decl_dims_str = cxx.dimsToString(decl_dims)
        decl_first_dim_str = ""
        if decl_dims != []:
            decl_first_dim_str = cxx.dimsToString([decl_dims[0]])

        full_dims = decl_dims + aliasType.dims()
        is_array = full_dims != []
        is_array_declarator = decl_dims != []

        fq_derived = scopedName.fullyQualify()

        if d_type.sequence() and not aliasType.typedef():
            seqType = types.Type(d_type.type().seqType())
            d_seqType = seqType.deref()
            if d_seqType.structforward() or d_seqType.unionforward():
                fqname = scopedName.fullyQualify()
                name = id.mapID(d.identifier())
                element = d_seqType.base()
                bound = d_type.type().bound()
                derived = d_type.sequenceTemplate()

                if (bound > 0):
                    stream.out(template.sequence_forward_bounded_defns,
                               bound=bound,
                               fqname=fqname,
                               name=name,
                               element=element,
                               derived=derived)
                else:
                    stream.out(template.sequence_forward_unbounded_defns,
                               fqname=fqname,
                               name=name,
                               element=element,
                               derived=derived)

                stream.out(template.sequence_forward_defns,
                           fqname=fqname,
                           name=name,
                           element=element)
Пример #6
0
def visitOperation(node):
    returnType = types.Type(node.returnType())
    if returnType.string():
        returnType.type().accept(self)
    elif returnType.wstring():
        returnType.type().accept(self)

    for p in node.parameters():
        paramType = types.Type(p.paramType())
        if paramType.string():
            paramType.type().accept(self)
        elif paramType.wstring():
            paramType.type().accept(self)
Пример #7
0
    def createReturn(self, operation):
        """
        corba:
          base_type:
          ret_type:
          decl_type:
          tk:
        local:
          base_type:
          ret_type:
          decl_type:
          tk:
        """
        dict = self.createDecl('return')
        cdict = dict['corba']
        ldict = dict['local']

        retType = types.Type(operation.returnType())
        (corba_type, local_type, is_primitive) = self.getType(retType)
        cdict['base_type'] = corba_type
        ldict['base_type'] = local_type 
        if is_primitive != None:
            cdict['is_primitive'] = is_primitive
        retn_type = types.Type(operation.returnType()).op(types.RET)
        retn_type = retn_type.replace('CORBA', '::CORBA')
        retn_type = retn_type.replace('RTC', '::RTC')
        retn_type = retn_type.replace('SDOPackage', '::SDOPackage')
        retn_type = retn_type.replace('::::', '::')
        cdict['retn_type'] = retn_type

        if retType.objref(): local_rtype = local_type + '*'
        else:                local_rtype = local_type

        ldict['retn_type'] = local_rtype
        cdict['tk'] = ldict['tk'] = self.tk_map[retType.kind()]

        if retType.deref().sequence():
            retType = retType.deref()

        if retType.sequence():
            seqType = types.Type(retType.type().seqType())
            # get type of element of sequence
            (corba_etype, local_etype, is_primitive) = self.getType(seqType)
            cdict['deref_tk'] = self.tk_map[seqType.kind()]
        else:
            derefType = retType.deref()
            (corba_dtype, local_dtype, is_primitive) = self.getType(derefType)
            cdict['deref_tk'] = self.tk_map[derefType.kind()]
        return dict
Пример #8
0
def visitValueBox(node):
    boxedType = types.Type(node.boxedType())

    recurse(boxedType, node.constrType())

    scopedName = node.scopedName()
    mangled_name = mangleName(config.state['Private Prefix'] +\
                              "_tc_", scopedName)
    if alreadyDefined(mangled_name):
        return

    repoID = node.repoId()
    typecode = mkTypeCode(boxedType)

    scopedName = node.scopedName()
    boxed_name = id.Name(scopedName).simple()

    tophalf.out("""\
static CORBA::TypeCode_ptr @mangled_name@ = CORBA::TypeCode::PR_value_box_tc("@repoID@", "@name@", @typecode@, &@pprefix@_tcTrack);

""",
                mangled_name=mangled_name,
                repoID=repoID,
                name=boxed_name,
                typecode=typecode,
                pprefix=config.state['Private Prefix'])

    defineName(mangled_name)
    external_linkage(node)
Пример #9
0
def visitTypedef(node):
    aliasType = types.Type(node.aliasType())

    recurse(aliasType, node.constrType())

    for declarator in node.declarators():
        declarator.accept(self)
Пример #10
0
def buildMembersStructure(node):
    struct = output.StringStream()
    mangled_name = mangleName(config.state['Private Prefix'] + \
                              "_structmember_", node.scopedName())
    if alreadyDefined(mangled_name):
        # no need to regenerate
        return struct

    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=",\n".join(array),
                   mangled_name=mangled_name)

    return struct
Пример #11
0
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@, &@pprefix@_tcTrack);

""",
                mangled_name=mangled_name,
                repoID=repoID,
                name=typedef_name,
                typecode=typecode,
                pprefix=config.state['Private Prefix'])
    defineName(mangled_name)

    external_linkage(declarator)
Пример #12
0
    def createMember(self, decl, member, env):
        dict = self.createDecl('member')
        cdict = dict['corba']
        ldict = dict['local']

        memberType = types.Type(member.memberType())
        memtype = memberType.member(env)

        (ctype, ltype, is_primitive) = self.getType(memberType)
        cdict['base_type'] = ctype
        cdict['tk'] = self.tk_map[memberType.kind()]
        ldict['base_type'] = ltype
        cdict['member_name'] = id.mapID(decl.identifier())
        cdict['member_dims'] = decl.sizes()
        ldict['member_name'] = cdict['member_name']
        ldict['member_dims'] = cdict['member_dims']

        if memberType.objref():
            corba_mtype = ctype
            local_mtype = ltype + '*'
        else:
            corba_mtype = ctype
            local_mtype = ltype

        cdict['member_type'] = corba_mtype
        ldict['member_type'] = local_mtype
        return dict
Пример #13
0
def buildStateMembersStructure(node):
    struct = output.StringStream()
    mangled_name = mangleName(config.state['Private Prefix'] + \
                              "_valuemember_", node.scopedName())
    if alreadyDefined(mangled_name):
        # no need to regenerate
        return struct

    defineName(mangled_name)

    members = node.statemembers()
    array = []

    if members:
        for m in members:
            memberType = types.Type(m.memberType())
            access = m.memberAccess()
            for d in m.declarators():
                this_name = id.Name(d.scopedName()).simple()
                typecode = mkTypeCode(memberType, d, node)
                array.append('{"%s", %s, %d}' % (this_name, typecode, access))

        struct.out("""\
static CORBA::PR_valueMember @mangled_name@[] = {
  @members@
};""",
                   members=",\n".join(array),
                   mangled_name=mangled_name)
    else:
        struct.out("""\
static CORBA::PR_valueMember* @mangled_name@ = 0;""",
                   mangled_name=mangled_name)

    return struct
Пример #14
0
    def createUnionIdent(self, dict, node):
        """
        共用体宣言のの識別子に関するディクショナリの生成
        
        corba:
          idl_name:          宣言のidl上の識別子
          name:              C++にマッピングされた識別子
          name_fq:           C++識別子の完全修飾名
          scoped_name: []    リスト形式の完全修飾名
          switch_type:       switchの型
          switch_fq_type:    switchの完全修飾型
          deref_switch_type: switchの非参照型
        local:
          idl_name:          宣言のidl上の識別子
          name:              C++にマッピングされた識別子
          name_fq:           C++識別子の完全修飾名
          scoped_name: []    リスト形式の完全修飾名

        """
        self.createIdent(dict, node)
        cdict = dict['corba']
        ldict = dict['local']

        switchType = types.Type(node.switchType())
        ast.markDefaultCase(node)
        hasDefault = ast.defaultCase(node) != None

        (ctype, ltype, is_primitive) = self.getType(switchType)
        cdict['switch_fq_type'] = ctype
        cdict['switch_type']    = ctype.split('::')[-1]
        ldict['switch_fq_type'] = ltype
        ldict['switch_type']    = ltype.split('::')[-1]
        return 
Пример #15
0
    def out_implcall(self, stream, operation, localcall_fn):
        assert isinstance(stream, output.Stream)

        ctor_args = [
            localcall_fn, "\"" + operation + "\"",
            str(len(operation) + 1),
            str(1)
        ]

        prepare_out_args = []

        if self.__has_out_args:
            for n, argument in enumerate(self.__arguments):
                if argument.is_out() and not argument.is_in():
                    arg_n = "_call_desc.arg_" + str(n)
                    argtype = types.Type(argument.paramType())
                    ((h_is_const,h_is_ptr),(s_is_holder,s_is_var)) = \
                                    _arg_info(argtype,argument.direction())
                    if not s_is_holder:
                        rvalue = arg_n + "_"
                        if s_is_var:
                            rvalue = rvalue + ".out()"
                        if h_is_ptr:
                            rvalue = "&" + rvalue
                        prepare_out_args.append(arg_n + " = " + rvalue + ";")

        # main block of code goes here
        stream.out(template.interface_operation_dispatch,
                   idl_operation_name=operation,
                   call_descriptor=self.__name,
                   call_desc_args=", ".join(ctor_args),
                   prepare_out_args="\n".join(prepare_out_args))
Пример #16
0
def visitTypedef(node):
    if node.constrType():
        node.aliasType().decl().accept(self)

    aliasType = types.Type(node.aliasType())
    prefix = config.state['Private Prefix']

    for d in node.declarators():
        scopedName = id.Name(d.scopedName())
        guard_name = scopedName.guard()
        fqname = scopedName.fullyQualify()

        if d.sizes():
            # Array
            marshal = output.StringStream()
            skutil.marshall(marshal, None, aliasType, d, "_a", "_s")

            unmarshal = output.StringStream()
            skutil.unmarshall(unmarshal, None, aliasType, d, "_a", "_s")

            stream.out(template.array,
                       guard_name=guard_name,
                       fqname=fqname,
                       marshal=marshal,
                       unmarshal=unmarshal,
                       private_prefix=prefix)

        elif aliasType.sequence():
            stream.out(template.sequence,
                       guard_name=guard_name,
                       fqname=fqname,
                       private_prefix=prefix)
Пример #17
0
    def createArgs(self, operation, env):
        """

        corba:
          base_type:
          arg_type:
          arg_name:
          var_name:
          decl_type:
          direction:
          tk:
        local:
          base_type:
          arg_type:
          arg_name:
          var_name:
          decl_type:
          direction:
          tk:


        """
        args = []
        direction = ['in', 'out', 'inout','return']
        for arg in operation.parameters():
            # corba args information
            dict = self.createDecl('arg')
            cdict = dict['corba']
            ldict = dict['local']

            paramType = types.Type(arg.paramType())
            (corba_type, local_type, is_primitive) = self.getType(paramType)

            cdict['base_type'] = corba_type
            ldict['base_type'] = local_type
            if is_primitive != None:
                cdict['is_primitive'] = is_primitive

            arg_name = id.mapID(arg.identifier())
            cdict['arg_name'] = arg_name
            ldict['arg_name'] = arg_name
            cdict['var_name'] = '_' + arg_name
            ldict['var_name'] = '_' + arg_name

            direction_val = direction[arg.direction()]
            cdict['direction'] = direction_val
            ldict['direction'] = direction_val

            cdict['tk'] = ldict['tk'] = self.tk_map[paramType.kind()]
            arg_type = paramType.op(types.direction(arg), use_out = 0)
            arg_type = arg_type.replace('CORBA', '::CORBA')
            arg_type = arg_type.replace('RTC', '::RTC')
            arg_type = arg_type.replace('SDOPackage', '::SDOPackage')
            arg_type = arg_type.replace('::::', '::')
            cdict['arg_type']  = arg_type
            out = arg.is_out()
            self.createArg(dict, paramType, out)
            args.append(dict)
        return args
Пример #18
0
 def marshal(stream=stream, node=node, env=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, env, memberType, d, member_name, "_n")
     return
Пример #19
0
    def __out_unmarshalArgument(self,stream):
        if not self.__has_in_args: return

        marshal_block = output.StringStream()

        for n, argument in enumerate(self.__arguments):
            if not argument.is_in(): continue

            argtype = types.Type(argument.paramType())
            ((h_is_const,h_is_ptr),(s_is_holder,s_is_var)) = \
                         _arg_info(argtype,argument.direction())

            arg_n = "arg_%d" % n
            if s_is_holder:
                storage_n = arg_n
            else:
                storage_n = arg_n + "_"
                
            if s_is_var:
                alloc = ""
                d_type = argtype.deref(1)

                if argtype.array():
                    alloc = argtype.base() + "_alloc()"
                elif not (d_type.typecode()  or
                          d_type.string()    or
                          d_type.wstring()   or
                          d_type.interface() or
                          d_type.value()     or
                          d_type.valuebox()):
                    alloc = "new " + argtype.base()
                if alloc != "":
                    marshal_block.out(storage_n + " = " + alloc + ";")

            skutil.unmarshall(marshal_block, None,
                              argtype, None, storage_n, "_n")

            if not s_is_holder:
                if s_is_var:
                    if argument.direction() == 0:
                        lvalue = storage_n + ".in()"
                    else:
                        lvalue = storage_n + ".inout()"
                else:
                    lvalue = storage_n
                if argtype.array():
                    lvalue = "&" + lvalue + "[0]"
                if h_is_ptr:
                    marshal_block.out(arg_n + " = &" + lvalue + ";")
                else:
                    marshal_block.out(arg_n + " = " + lvalue + ";")

        if self.__contexts:
            marshal_block.out(template.interface_proxy_unmarshal_context)

        stream.out(template.interface_proxy_unmarshal_arguments,
                   call_descriptor = self.__name,
                   marshal_block = marshal_block)
Пример #20
0
def produce_signature(returnType, parameters, raises, oneway, ami):

    returnType = types.Type(returnType)
    d_returnType = returnType.deref()

    # return type
    if d_returnType.void():
        sig = "void"
    else:
        sig = canonTypeName(returnType, useScopedName=1)

    if oneway:
        # Can only validly happen with void return, but you never know
        # what the future may hold.
        sig = ONEWAY_SEPARATOR + sig

    # parameter list
    for param in parameters:
        if param.is_in() and param.is_out():
            sig = sig + INOUT_SEPARATOR
        elif param.is_in():
            sig = sig + IN_SEPARATOR
        elif param.is_out():
            sig = sig + OUT_SEPARATOR

        sig = sig + canonTypeName(types.Type(param.paramType()),
                                  useScopedName=1)

    # exception list
    raises = skutil.sort_exceptions(raises)

    def exception_signature(exception):
        cname = CANNON_NAME_SEPARATOR +\
                id.Name(exception.scopedName()).guard()
        return EXCEPTION_SEPARATOR + cname

    raises_sigs = list(map(exception_signature, raises))
    raises_str = "".join(raises_sigs)

    sig = sig + raises_str

    if ami:
        sig = sig + ASYNC_TAG

    return sig
Пример #21
0
    def addOps(self,node,ops):
	
	for i in node.inherits():
            self.addOps(i,ops)

        for d in node.contents():
            if isinstance(d, idlast.Operation):
                new_op = CC.Operation(d.identifier(),baseTypes[d.returnType().kind()])
                # Get the c++ mappping of the return type
                cxxRT = types.Type(d.returnType())
                new_op.cxxReturnType = cxxRT.base()
#                if new_op.returnType == 'string':
#                    print foo2.base()
                #print new_op.name + "::" + d.identifier() + "()"
                #tmpstr = node.identifier() + "::" + d.identifier() + "("
                #tmpstr2 = "  " + node.identifier() + "::" + d.identifier() + "("
                if hasattr(d,'parameters'):
                    for p in d.parameters():
                        new_param = CC.Param(p.identifier())
                        t =  p.paramType()
                        # Get the c++ mapping of the type
                        cxxT = types.Type(t)
                        new_param.cxxType = cxxT.op(types.direction(p))
						
                        if hasattr(t,'scopedName'):
                            #print ' '*8 + str(t.scopedName()),
                            new_param.dataType = idlutil.ccolonName(t.scopedName())
                        else:
                            if isinstance(t,idltype.Type):
                                #print ' '*8 + baseTypes[t.kind()],
                                new_param.dataType = baseTypes[t.kind()]

                        if p.is_in() and p.is_out():
                            new_param.direction = 'inout'
                        elif p.is_out():
                            new_param.direction = 'out'
                        else:
                            new_param.direction = 'in'
                        new_op.params.append(new_param)
                        #tmpstr += new_param.direction + " " + new_param.dataType + ","
                        #tmpstr2 += new_param.direction + " " + new_param.cxxType + ","
                ops.append(new_op)
Пример #22
0
 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")
Пример #23
0
 def __out_marshalArgument_shared(self,stream,is_in):
     for n, argument in enumerate(self.__arguments):
         if (is_in and not argument.is_in()) or \
            (not is_in and not argument.is_out()): continue
         arg_n = "arg_" + str(n)
         argtype = types.Type(argument.paramType())
         ((h_is_const,h_is_ptr),(s_is_holder,s_is_var)) = \
                      _arg_info(argtype,argument.direction())
         if h_is_ptr:
             arg_n = "*" + arg_n
         skutil.marshall(stream, None, argtype, None, arg_n, "_n")
Пример #24
0
def 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)
Пример #25
0
 def retConversion(self, type):
     """
     Returns two values:
     - storing: will be used as "${storing} (${hpp_method_call})."
     - converting: will be copied as such after the line above.
     """
     if type.void():
         return "", ""
     if type.char() or type.floating() or type.boolean() or type.integer():
         return "return", ""
     if type.string():
         return "return ::hpp::corbaServer::c_str", ""
     if type.typedef():
         if type.type().name() in ("size_t", "size_type", "value_type"):
             return "return", ""
         elif type.type().name() == "floatSeq":
             return "return hpp::corbaServer::vectorToFloatSeq", ""
         elif type.type().name() == "Transform_":
             return "return hpp::corbaServer::toHppTransform", ""
         else:
             unaliased = type.deref()
             if unaliased.sequence():
                 innerType = types.Type(unaliased.type().seqType())
                 if innerType.objref():
                     if isinstance(innerType.type().decl(), idlast.Forward):
                         base = get_base_class(
                             innerType.type().decl().fullDecl())
                     else:
                         base = get_base_class(innerType.type().decl())
                     return "return hpp::corbaServer::vectorToSeqServant<{outType},{innerBaseType},{innerType}>(server_)"\
                             .format(innerBaseType=hpp_servant_name(id.Name(base.scopedName())),
                                     innerType=hpp_servant_name(id.Name(innerType.type().scopedName())),
                                     outType=id.Name(type.type().scopedName()).fullyQualify(cxx=1)), ""
                 else:
                     print("Unhandled sequence of", innerType.type().name())
             else:
                 print("Unhandled type", type.type().name())
         return "", ""
     if type.objref():
         if isinstance(type.type().decl(), idlast.Forward):
             base = get_base_class(type.type().decl().fullDecl())
         else:
             base = get_base_class(type.type().decl())
         store = "{type} __return__".format(type=self.toCppNamespace(
             id.Name(type.type().scopedName()).suffix(
                 "Ptr_t")).fullyQualify(cxx=1))
         conv  = "return makeServantDownCast<{basetype},{type}>(server_, __return__)._retn();" \
                 .format(type=hpp_servant_name(id.Name(type.type().scopedName())),
                         basetype=hpp_servant_name(id.Name(base.scopedName())))
         return store, conv
     print(type.type(), type.kind())
     return "", ""
Пример #26
0
    def getType(self, typeobj):
        """
        CORBA と Local の型名を取得する
        """
        corba_type = typeobj.base()
        # for omniidl4 4.1.1-2
        if corba_type[:2] == "::":
            corba_type = corba_type[2:]
        is_primitive = None
        # if CORBA to Local mapping is specified explicitly
        if self.typemap.has_key(corba_type):
            local_type = self.typemap[corba_type]

        # if CORBA type is primitive, string or Any
        elif self.corba_primitive.has_key(corba_type):
            local_type = self.corba_primitive[corba_type]
            if corba_type[:5] == 'CORBA':
                corba_type = '::' + corba_type
            tk = self.tk_map[typeobj.kind()]
            primitive = ["tk_short", "tk_long", "tk_ushort", 
                         "tk_ulong", "tk_float", "tk_double",
                         "tk_boolean", "tk_char", "tk_octet"]
            if primitive.count(tk) > 0:
                is_primitive = 'YES'


        # other case
        else:
            corba_scoped_type = corba_type.split('::')
            corba_ns = corba_scoped_type[:-1]
            corba_base = corba_scoped_type[-1]
            local_ns = corba_ns + self.config['IfaceNs']
            local_scope = string.join(local_ns, '::')
            if typeobj.objref():
                corba_base = corba_base[:corba_base.rfind('_ptr')]
                local_type = local_scope + '::' + \
                    self.config['IfacePrefix'] + \
                    corba_base + \
                    self.config['IfaceSuffix']
            elif typeobj.sequence():
                seqType = types.Type(typeobj.type().seqType())
                # get type of element of sequence
                (corba_etype, local_etype, eis_primitive) = self.getType(seqType)
                if seqType.objref():
                    local_etype = local_etype + '*'
                local_type = "std::vector< " + local_etype + " >"

            else:
                local_type = local_scope + '::' + corba_base
            corba_type = '::' + corba_type
            local_type = '::' + local_type
        return (corba_type, local_type, is_primitive)       
Пример #27
0
    def createUnionCases(self, dict, node):
        cases = []
        switchType = types.Type(node.switchType())
        ast.markDefaultCase(node) 
        outer_environment = id.lookup(node)
        environment = outer_environment.enter(node.identifier())

        for case in node.cases():
            c = self.createUnionCase(case, node, switchType, environment)
            if c != None:
                cases.append(c)
        dict['cases'] = cases
        return dict
Пример #28
0
    def createTypedef(self, aliasType, decl, env):
        """
        typedef宣言に関するディクショナリの生成

        corba:
          derived_type:    導出型名
          derived_fq_type: 完全修飾導出型名
          deref_type:      非参照型名
          deref_fq_type:   完全修飾非参型名
          tk: TypeCode
        local:
          derived_type:    導出型名
          derived_fq_type: 完全修飾導出型名
          deref_type:      非参照型名
          deref_fq_type:   完全修飾非参型名
        """

        dict = self.createDecl('typedef')
        cdict = dict['corba']
        ldict = dict['local']

        (cdict['base_type'], ldict['base_type'], is_primitive) = self.getType(aliasType)
        derivedName = id.mapID(decl.identifier())
        alias_dims = aliasType.dims()
        cdict['derived_type'] = derivedName
        ldict['derived_type'] = derivedName

        corba_ns = '::' + string.join(cdict['corba_ns'], '::')
        local_ns = '::' + string.join(ldict['iface_ns'], '::')
        cdict['derived_type_fq'] = corba_ns + '::' + derivedName
        ldict['derived_type_fq'] = local_ns + '::' + derivedName
        cdict['tk'] = tk = self.tk_map[aliasType.kind()]
        primitive = ["tk_short", "tk_long", "tk_ushort", 
                     "tk_ulong", "tk_float", "tk_double",
                     "tk_boolean", "tk_char", "tk_octet"]
        if primitive.count(tk) > 0:
            cdict['is_primitive'] = 'YES'

        if aliasType.sequence():
            seqType = types.Type(aliasType.type().seqType())
            # get type of element of sequence
            (corba_etype, local_etype, is_primitive) = self.getType(seqType)
            cdict['element_tk'] = self.tk_map[seqType.kind()]
            if seqType.objref():
                cdict['element_type_fq'] = corba_etype
                ldict['element_type_fq'] = local_etype + '*'
            else:
                cdict['element_type_fq'] = corba_etype
                ldict['element_type_fq'] = local_etype
        return dict
Пример #29
0
    def visitTypedef(self, node):
        environment = id.lookup(node)
        scope = environment.scope()
        aliasType = types.Type(node.aliasType())
        aliasTypeID = aliasType.member(environment)

        if node.constrType():
            node.aliasType().decl().accept(self)


        for decl in node.declarators():
            dict = self.createTypedef(aliasType, decl, environment)
            self.dict['tree'].append(dict)
        return
Пример #30
0
    def _from_Callable(self, use_out):
        # Grab the IDL environment
        ifc = self.callable().interface()
        environment = ifc.environment().enter("_objref_" + ifc.name().simple())

        # Kept as a type object because in .cc part the _return_ type
        # must be fully qualified.
        self._return_type = types.Type(self.callable().returnType())

        # Parameters are always relative, both in .hh and .cc
        (param_types, param_names) = ([], [])
        for p in self.callable().parameters():
            pType = types.Type(p.paramType())
            direction = types.direction(p)
            param_types.append(
                pType.op(direction, environment, use_out=use_out))

            # Special ugly case. If the IDL says something like (in foo::bar
            # bar), the parameter name may be the same as the relative type
            # name. We mangle the parameter name if this happens.

            typeBase = pType.base(environment)
            ident = id.mapID(p.identifier())

            if typeBase == ident:
                ident = "_" + ident

            param_names.append(ident)

        # an operation has optional context
        if self.callable().contexts() != []:
            param_types.append("::CORBA::Context_ptr")
            param_names.append("_ctxt")

        self._arg_types = param_types
        self._arg_names = param_names
        self._name = self.callable().method_name()