Example #1
0
def p_primary_expression_7(p):
    '''primary_expression : MAP '(' postfix_expression ',' postfix_expression ')' '''
    if m.symbols.is_function(p[3]['id']):
        type1 = m.symbols.args(p[3]['id'])[0]
        type2 = m.symbols.primary_type(p[3]['id'], src=True)
        if type1 not in [m._type_int, m._type_float] or type2 not in [m._type_int, m._type_float]:
            m.error('map type unsuported {0}, {1}'.format(type1, type2))
    else:
        m.error('map first argument must be a function, or a function pointer')

    if m.symbols.is_function(p[3]['id']) and not m.symbols.modifiers(p[3]['id']) :
        var, tmp = cg.cast(p[3], m._type_ptr+'*')
        func = m.new_reg()
        m.symbols.add(func, m._type_ptr, '**')
        tmp1 = "{0} = alloca {1}".format(m.symbols.var(func), m.symbols.dereference(func))
        tmp2 = "store {0} {1}, {2} {3}".format(m.symbols.type(var),
            m.symbols.var(var), m.symbols.type(func), m.symbols.var(func))
        funcl = tmp + cg.indent(tmp1) + cg.indent(tmp2)
    else :
        func = p[3]['id']
        funcl =''

    if m.symbols.is_array(p[5]['id']) :
        tab, tabl = cg.getelementptr(p[5]['id'], 0, 'argument_expression_list')
    else:
        tab = p[5]['id']
        tabl = ''

    p[0] = {}
    p[0]['id'] = m.new_reg()
    size = cg.length(p[5])
    if 'const' in size:
        tab_size = size['const']
    else:
        tab_size = "{0} {1}".format(m.symbols.type(size['id']), m.symbols.var(size['id']))


    m.symbols.add(p[0]['id'], type2, '*')
    l = "{0} = call {2}* (i8**, {1}*, i32)* @..{1}.{2}.map({3} {4}, {5} {6}, {7})".format(
        m.symbols.var(p[0]['id']), type1, type2, m.symbols.type(func), m.symbols.var(func),
        m.symbols.type(tab), m.symbols.var(tab), tab_size)

    m.symbols.set_allocated(p[0]['id'], m.last_alloc())
    p[0]['code'] = funcl + tabl + size['code'] + cg.indent(l)
Example #2
0
def p_primary_expression_14(p):
    '''primary_expression : LEN '(' postfix_expression ')' '''
    p[0] = {}
    p[0] = cg.length(p[3])