// File: kelwinfc[P]ci4721-Fernandez-Gyomrey/src/AST/check.cpp
// Function: AST_variable_declaration::fill_and_check(symbol_table*)
void AST_variable_declaration::fill_and_check(symbol_table* st){

    if (types.has_type(sym->getName())) {
        logger->buf << "Identificador '" << sym->getName()
                    << "' ya existe como tipo '" << types.get_type(sym->getName())->name << "'.";
        logger->error(sym->getLine(), sym->getColumn());
    }

    sym->offset    = st->accumulated_offset;
    sym->width     = types.types[sym->getType()]->width;
    sym->alignment = types.types[sym->getType()]->alignment;
    
    int level;
    symbol* previous = st->lookup(sym->getName(), &level);
    
    if ( value ){
        value->fill_and_check(st);
    }
    
    if ( previous ){
        if ( previous->is_function ){
            logger->buf << "Identificador '" << sym->getName()
                        << "' ya fue definido previamente como función en "
                        << sym->getLine() << ':' << sym->getColumn();
            logger->error(sym->getLine(), sym->getColumn());
        } else if ( level == 0 ){
            logger->buf << "Identificador '" << sym->getName()
                        << "' ya fue definido previamente en "
                        << sym->getLine() << ':' << sym->getColumn();
            logger->error(sym->getLine(), sym->getColumn());
        } else {
            st->insert(sym);
        }
    } else {
        st->insert(sym);
    }
    
    if ( value
         && value->type != sym->getType()
         && value->type != INVALID
         && sym->getType() != INVALID
       )
    {
        logger->buf << "Inicialización de '" << sym->getName()
                    << "' con tipo inválido '" << types.types[value->type]->name
                    << "', esperado '" << types.types[sym->getType()]->name << "'.";
        logger->error(line, column);
    }
}

// Assembly:
subq $0x268, %rsp            # imm = 0x268
movq %rdi, 0x260(%rsp)
movq %rsi, 0x258(%rsp)
movq 0x260(%rsp), %rax
movq %rax, 0x140(%rsp)
movq 0x98(%rax), %rsi
leaq 0x238(%rsp), %rdi
movq %rdi, 0x148(%rsp)
callq 0x295b0
movq 0x148(%rsp), %rsi
leaq 0x6093e(%rip), %rdi     # 0x6e4e0
callq 0x2d910
movb %al, 0x157(%rsp)
jmp 0xdbb0
leaq 0x238(%rsp), %rdi
callq 0x6778
movb 0x157(%rsp), %al
testb $0x1, %al
jne 0xdbcd
jmp 0xddac
leaq 0x60904(%rip), %rax     # 0x6e4d8
movq (%rax), %rdi
addq $0x48, %rdi
leaq 0x44c96(%rip), %rsi     # 0x52878
callq 0x6370
movq %rax, %rcx
movq 0x140(%rsp), %rax
movq %rcx, 0x128(%rsp)
movq 0x98(%rax), %rsi
leaq 0x208(%rsp), %rdi
movq %rdi, 0x130(%rsp)
callq 0x295b0
movq 0x128(%rsp), %rdi
movq 0x130(%rsp), %rsi
callq 0x6340
movq %rax, 0x138(%rsp)
jmp 0xdc35
movq 0x138(%rsp), %rdi
leaq 0x44e1e(%rip), %rsi     # 0x52a62
callq 0x6370
movq %rax, 0x120(%rsp)
jmp 0xdc53
movq 0x140(%rsp), %rax
movq 0x98(%rax), %rsi
leaq 0x1e8(%rsp), %rdi
callq 0x295b0
jmp 0xdc71
leaq 0x60868(%rip), %rdi     # 0x6e4e0
leaq 0x1e8(%rsp), %rsi
callq 0x2daa0
movq %rax, 0x118(%rsp)
jmp 0xdc8f
movq 0x120(%rsp), %rdi
movq 0x118(%rsp), %rsi
addq $0x8, %rsi
callq 0x6340
movq %rax, 0x110(%rsp)
jmp 0xdcb2
movq 0x110(%rsp), %rdi
leaq 0x499f6(%rip), %rsi     # 0x576b7
callq 0x6370
jmp 0xdcc8
leaq 0x1e8(%rsp), %rdi
callq 0x6778
leaq 0x208(%rsp), %rdi
callq 0x6778
movq 0x140(%rsp), %rax
leaq 0x607e7(%rip), %rcx     # 0x6e4d8
movq (%rcx), %rcx
movq %rcx, 0x100(%rsp)
movq 0x98(%rax), %rdi
callq 0x29600
movl %eax, %ecx
movq 0x140(%rsp), %rax
movl %ecx, 0x10c(%rsp)
movq 0x98(%rax), %rdi
callq 0x29610
movq 0x100(%rsp), %rdi
movl 0x10c(%rsp), %esi
movl %eax, %edx
callq 0x2f440
jmp 0xddac
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x230(%rsp)
movl %eax, 0x22c(%rsp)
leaq 0x238(%rsp), %rdi
callq 0x6778
jmp 0xe470
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x230(%rsp)
movl %eax, 0x22c(%rsp)
jmp 0xdd9a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x230(%rsp)
movl %eax, 0x22c(%rsp)
leaq 0x1e8(%rsp), %rdi
callq 0x6778
leaq 0x208(%rsp), %rdi
callq 0x6778
jmp 0xe470
movq 0x140(%rsp), %rax
movq 0x258(%rsp), %rcx
movl 0xc(%rcx), %edx
movq 0x98(%rax), %rcx
movl %edx, 0x34(%rcx)
movq 0x98(%rax), %rdi
callq 0x295f0
movslq %eax, %rsi
leaq 0x60701(%rip), %rdi     # 0x6e4e0
movq %rdi, 0xe0(%rsp)
callq 0x1fc90
movq %rax, %rcx
movq 0x140(%rsp), %rax
movq (%rcx), %rcx
movl 0x28(%rcx), %edx
movq 0x98(%rax), %rcx
movl %edx, 0x38(%rcx)
movq 0x98(%rax), %rdi
callq 0x295f0
movq 0xe0(%rsp), %rdi
movslq %eax, %rsi
callq 0x1fc90
movq %rax, %rcx
movq 0x140(%rsp), %rax
movq (%rcx), %rcx
movl 0x2c(%rcx), %edx
movq 0x98(%rax), %rcx
movl %edx, 0x3c(%rcx)
movq 0x258(%rsp), %rcx
movq %rcx, 0xe8(%rsp)
movq 0x98(%rax), %rsi
leaq 0x1b8(%rsp), %rdi
movq %rdi, 0xf0(%rsp)
callq 0x295b0
movq 0xe8(%rsp), %rdi
movq 0xf0(%rsp), %rsi
leaq 0x1e4(%rsp), %rdx
callq 0x2a040
movq %rax, 0xf8(%rsp)
jmp 0xde91
leaq 0x1b8(%rsp), %rdi
callq 0x6778
movq 0xf8(%rsp), %rcx
movq 0x140(%rsp), %rax
movq %rcx, 0x1d8(%rsp)
cmpq $0x0, 0xa0(%rax)
je 0xdf05
movq 0x140(%rsp), %rax
movq 0xa0(%rax), %rdi
movq 0x258(%rsp), %rsi
movq (%rdi), %rax
callq *0x8(%rax)
jmp 0xdf05
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x230(%rsp)
movl %eax, 0x22c(%rsp)
leaq 0x1b8(%rsp), %rdi
callq 0x6778
jmp 0xe470
cmpq $0x0, 0x1d8(%rsp)
je 0xe269
movq 0x1d8(%rsp), %rax
testb $0x1, 0x31(%rax)
je 0xe0c7
leaq 0x605ab(%rip), %rax     # 0x6e4d8
movq (%rax), %rdi
addq $0x48, %rdi
leaq 0x4493d(%rip), %rsi     # 0x52878
callq 0x6370
movq %rax, %rcx
movq 0x140(%rsp), %rax
movq %rcx, 0xc8(%rsp)
movq 0x98(%rax), %rsi
leaq 0x198(%rsp), %rdi
movq %rdi, 0xd0(%rsp)
callq 0x295b0
movq 0xc8(%rsp), %rdi
movq 0xd0(%rsp), %rsi
callq 0x6340
movq %rax, 0xd8(%rsp)
jmp 0xdf8e
movq 0xd8(%rsp), %rdi
leaq 0x44add(%rip), %rsi     # 0x52a7a
callq 0x6370
movq %rax, 0xc0(%rsp)
jmp 0xdfac
movq 0x140(%rsp), %rax
movq 0x98(%rax), %rdi
callq 0x29600
movl %eax, 0xbc(%rsp)
jmp 0xdfc9
movl 0xbc(%rsp), %esi
movq 0xc0(%rsp), %rdi
callq 0x6690
movq %rax, 0xb0(%rsp)
jmp 0xdfe7
movq 0xb0(%rsp), %rdi
movl $0x3a, %esi
callq 0x6480
movq %rax, 0xa8(%rsp)
jmp 0xe003
movq 0x140(%rsp), %rax
movq 0x98(%rax), %rdi
callq 0x29610
movl %eax, 0xa4(%rsp)
jmp 0xe020
movl 0xa4(%rsp), %esi
movq 0xa8(%rsp), %rdi
callq 0x6690
jmp 0xe036
leaq 0x198(%rsp), %rdi
callq 0x6778
movq 0x140(%rsp), %rax
leaq 0x60486(%rip), %rcx     # 0x6e4d8
movq (%rcx), %rcx
movq %rcx, 0x98(%rsp)
movq 0x98(%rax), %rdi
callq 0x29600
movl %eax, %ecx
movq 0x140(%rsp), %rax
movl %ecx, 0xa0(%rsp)
movq 0x98(%rax), %rdi
callq 0x29610
movq 0x98(%rsp), %rdi
movl 0xa0(%rsp), %esi
movl %eax, %edx
callq 0x2f440
jmp 0xe267
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x230(%rsp)
movl %eax, 0x22c(%rsp)
leaq 0x198(%rsp), %rdi
callq 0x6778
jmp 0xe470
cmpl $0x0, 0x1e4(%rsp)
jne 0xe249
leaq 0x603fc(%rip), %rax     # 0x6e4d8
movq (%rax), %rdi
addq $0x48, %rdi
leaq 0x4478e(%rip), %rsi     # 0x52878
callq 0x6370
movq %rax, %rcx
movq 0x140(%rsp), %rax
movq %rcx, 0x80(%rsp)
movq 0x98(%rax), %rsi
leaq 0x178(%rsp), %rdi
movq %rdi, 0x88(%rsp)
callq 0x295b0
movq 0x80(%rsp), %rdi
movq 0x88(%rsp), %rsi
callq 0x6340
movq %rax, 0x90(%rsp)
jmp 0xe13d
movq 0x90(%rsp), %rdi
leaq 0x4495e(%rip), %rsi     # 0x52aaa
callq 0x6370
movq %rax, 0x78(%rsp)
jmp 0xe158
movq 0x140(%rsp), %rax
movq 0x98(%rax), %rdi
callq 0x29600
movl %eax, 0x74(%rsp)
jmp 0xe172
movl 0x74(%rsp), %esi
movq 0x78(%rsp), %rdi
callq 0x6690
movq %rax, 0x68(%rsp)
jmp 0xe187
movq 0x68(%rsp), %rdi
movl $0x3a, %esi
callq 0x6480
movq %rax, 0x60(%rsp)
jmp 0xe19d
movq 0x140(%rsp), %rax
movq 0x98(%rax), %rdi
callq 0x29610
movl %eax, 0x5c(%rsp)
jmp 0xe1b7
movl 0x5c(%rsp), %esi
movq 0x60(%rsp), %rdi
callq 0x6690
jmp 0xe1c7
leaq 0x178(%rsp), %rdi
callq 0x6778
movq 0x140(%rsp), %rax
leaq 0x602f5(%rip), %rcx     # 0x6e4d8
movq (%rcx), %rcx
movq %rcx, 0x50(%rsp)
movq 0x98(%rax), %rdi
callq 0x29600
movl %eax, %ecx
movq 0x140(%rsp), %rax
movl %ecx, 0x58(%rsp)
movq 0x98(%rax), %rdi
callq 0x29610
movq 0x50(%rsp), %rdi
movl 0x58(%rsp), %esi
movl %eax, %edx
callq 0x2f440
jmp 0xe265
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x230(%rsp)
movl %eax, 0x22c(%rsp)
leaq 0x178(%rsp), %rdi
callq 0x6778
jmp 0xe470
movq 0x140(%rsp), %rax
movq 0x258(%rsp), %rdi
movq 0x98(%rax), %rsi
callq 0x2a1f0
jmp 0xe267
jmp 0xe285
movq 0x140(%rsp), %rax
movq 0x258(%rsp), %rdi
movq 0x98(%rax), %rsi
callq 0x2a1f0
movq 0x140(%rsp), %rax
cmpq $0x0, 0xa0(%rax)
je 0xe468
movq 0x140(%rsp), %rax
movq 0xa0(%rax), %rcx
movl 0x10(%rcx), %ecx
movl %ecx, 0x4c(%rsp)
movq 0x98(%rax), %rdi
callq 0x295f0
movl %eax, %ecx
movl 0x4c(%rsp), %eax
cmpl %ecx, %eax
je 0xe468
movq 0x140(%rsp), %rax
movq 0xa0(%rax), %rax
cmpl $0x1, 0x10(%rax)
je 0xe468
movq 0x140(%rsp), %rax
movq 0x98(%rax), %rdi
callq 0x295f0
cmpl $0x1, %eax
je 0xe468
leaq 0x601d0(%rip), %rax     # 0x6e4d8
movq (%rax), %rdi
addq $0x48, %rdi
leaq 0x447b6(%rip), %rsi     # 0x52acc
callq 0x6370
movq %rax, %rcx
movq 0x140(%rsp), %rax
movq %rcx, 0x30(%rsp)
movq 0x98(%rax), %rsi
leaq 0x158(%rsp), %rdi
movq %rdi, 0x38(%rsp)
callq 0x295b0
movq 0x30(%rsp), %rdi
movq 0x38(%rsp), %rsi
callq 0x6340
movq %rax, 0x40(%rsp)
jmp 0xe35a
movq 0x40(%rsp), %rdi
leaq 0x4477b(%rip), %rsi     # 0x52ae1
callq 0x6370
movq %rax, 0x28(%rsp)
jmp 0xe372
movq 0x140(%rsp), %rax
movq 0xa0(%rax), %rax
movslq 0x10(%rax), %rsi
leaq 0x60154(%rip), %rdi     # 0x6e4e0
callq 0x1fc90
movq 0x28(%rsp), %rdi
movq (%rax), %rsi
addq $0x8, %rsi
callq 0x6340
movq %rax, 0x20(%rsp)
jmp 0xe3a9
movq 0x20(%rsp), %rdi
leaq 0x444a1(%rip), %rsi     # 0x52856
callq 0x6370
movq %rax, 0x18(%rsp)
jmp 0xe3c1
movq 0x140(%rsp), %rax
movq 0x98(%rax), %rdi
callq 0x295f0
movl %eax, 0x14(%rsp)
jmp 0xe3db
movl 0x14(%rsp), %eax
movslq %eax, %rsi
leaq 0x600f7(%rip), %rdi     # 0x6e4e0
callq 0x1fc90
movq 0x18(%rsp), %rdi
movq (%rax), %rsi
addq $0x8, %rsi
callq 0x6340
movq %rax, 0x8(%rsp)
jmp 0xe406
movq 0x8(%rsp), %rdi
leaq 0x492a5(%rip), %rsi     # 0x576b7
callq 0x6370
jmp 0xe419
leaq 0x158(%rsp), %rdi
callq 0x6778
movq 0x140(%rsp), %rax
leaq 0x600a3(%rip), %rcx     # 0x6e4d8
movq (%rcx), %rdi
movl 0x8(%rax), %esi
movl 0xc(%rax), %edx
callq 0x2f440
jmp 0xe468
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x230(%rsp)
movl %eax, 0x22c(%rsp)
leaq 0x158(%rsp), %rdi
callq 0x6778
jmp 0xe470
addq $0x268, %rsp            # imm = 0x268
retq
movq 0x230(%rsp), %rdi
callq 0x66b0
nopl (%rax)