// File: kelwinfc[P]ci4721-Fernandez-Gyomrey/src/AST/check.cpp
// Function: AST::fill_and_check(symbol_table*)
void AST::fill_and_check(symbol_table* st){
    
    // Declaracion previa de todas las funciones
    uint nsize = declarations.size();
    for ( uint i = 0; i != nsize; i++){
        if ( typeid(*declarations[i]) == typeid(AST_function) ){
            
            AST_function* f = (AST_function*)declarations[i];
            symbol_function* sf = (symbol_function*)st->lookup( f->func->getName() );
            
            if ( sf ){
                logger->buf << "Función '" << f->func->getName()
                            << "' con nombre repetido (primera declaración en "
                            << sf->getLine() << ':' << sf->getColumn() << ").";
                logger->error(f->func->getLine(), f->func->getColumn());
            } else {
                st->insert( f->func );
            }
        }
    }
    
    // Verificacion de existencia de main
    {
        symbol_function* sf = (symbol_function*)st->lookup( "main" );
        
        if ( !sf ){
            logger->buf << "Falta declaración de función main.";
            logger->error(yylineno+1, 0);
        } else if ( sf->getType() != NONE ){
            logger->buf << "main debe tener tipo de retorno none.";
            logger->error(sf->getLine(), sf->getColumn());
        } else if ( sf->params.size() ){
            logger->buf << "main no debe recibir argumentos.";
            logger->error(sf->getLine(), sf->getColumn());
        }
    }
    
    // Verificacion del programa
    vector<AST_declaration*>::iterator it;
    for ( it = declarations.begin(); it != declarations.end(); it++){
        (*it)->fill_and_check(st);
        
        if ( typeid(**it) == typeid(AST_variable_declaration) ){
            AST_variable_declaration* var = 
                (AST_variable_declaration*)*it;
            
            if (    var->value
                 && var->value->type != INVALID 
                 && var->value->has_functions()
               )
            {
                logger->buf << "Inicialización de variable '" << var->sym->getName()
                            << "' involucra llamada a función.";
                logger->error(var->line, var->column);
            }
        }
    }
}

// Assembly:
subq $0x1c8, %rsp            # imm = 0x1C8
movq %rdi, 0x1c0(%rsp)
movq %rsi, 0x1b8(%rsp)
movq 0x1c0(%rsp), %rdi
movq %rdi, 0xd0(%rsp)
addq $0x10, %rdi
callq 0x20010
movl %eax, 0x1b4(%rsp)
movl $0x0, 0x1b0(%rsp)
movl 0x1b0(%rsp), %eax
cmpl 0x1b4(%rsp), %eax
je 0xee39
movq 0xd0(%rsp), %rdi
addq $0x10, %rdi
movl 0x1b0(%rsp), %eax
movl %eax, %esi
callq 0x20030
movq (%rax), %rax
movq %rax, 0xc8(%rsp)
cmpq $0x0, %rax
jne 0xeb86
callq 0x6420
movq 0xc8(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5e3cc(%rip), %rsi     # 0x6cf68
callq 0x20340
testb $0x1, %al
jne 0xebaa
jmp 0xee21
movq 0xd0(%rsp), %rdi
addq $0x10, %rdi
movl 0x1b0(%rsp), %eax
movl %eax, %esi
callq 0x20030
movq (%rax), %rax
movq %rax, 0x1a8(%rsp)
movq 0x1b8(%rsp), %rax
movq %rax, 0xb0(%rsp)
movq 0x1a8(%rsp), %rax
movq 0x98(%rax), %rsi
leaq 0x180(%rsp), %rdi
movq %rdi, 0xb8(%rsp)
callq 0x295b0
movq 0xb0(%rsp), %rdi
movq 0xb8(%rsp), %rsi
xorl %eax, %eax
movl %eax, %edx
callq 0x2a040
movq %rax, 0xc0(%rsp)
jmp 0xec26
leaq 0x180(%rsp), %rdi
callq 0x6778
movq 0xc0(%rsp), %rax
movq %rax, 0x1a0(%rsp)
cmpq $0x0, 0x1a0(%rsp)
je 0xee03
leaq 0x5f87f(%rip), %rax     # 0x6e4d8
movq (%rax), %rdi
addq $0x48, %rdi
leaq 0x43d64(%rip), %rsi     # 0x529cb
callq 0x6370
movq %rax, 0x98(%rsp)
movq 0x1a8(%rsp), %rax
movq 0x98(%rax), %rsi
leaq 0x150(%rsp), %rdi
movq %rdi, 0xa0(%rsp)
callq 0x295b0
movq 0x98(%rsp), %rdi
movq 0xa0(%rsp), %rsi
callq 0x6340
movq %rax, 0xa8(%rsp)
jmp 0xecb7
movq 0xa8(%rsp), %rdi
leaq 0x43e6f(%rip), %rsi     # 0x52b35
callq 0x6370
movq %rax, 0x90(%rsp)
jmp 0xecd5
movq 0x1a0(%rsp), %rdi
callq 0x29600
movl %eax, 0x8c(%rsp)
jmp 0xeceb
movl 0x8c(%rsp), %esi
movq 0x90(%rsp), %rdi
callq 0x6690
movq %rax, 0x80(%rsp)
jmp 0xed09
movq 0x80(%rsp), %rdi
movl $0x3a, %esi
callq 0x6480
movq %rax, 0x78(%rsp)
jmp 0xed22
movq 0x1a0(%rsp), %rdi
callq 0x29610
movl %eax, 0x74(%rsp)
jmp 0xed35
movl 0x74(%rsp), %esi
movq 0x78(%rsp), %rdi
callq 0x6690
movq %rax, 0x68(%rsp)
jmp 0xed4a
movq 0x68(%rsp), %rdi
leaq 0x43b65(%rip), %rsi     # 0x528bb
callq 0x6370
jmp 0xed5d
leaq 0x150(%rsp), %rdi
callq 0x6778
leaq 0x5f767(%rip), %rax     # 0x6e4d8
movq (%rax), %rax
movq %rax, 0x58(%rsp)
movq 0x1a8(%rsp), %rax
movq 0x98(%rax), %rdi
callq 0x29600
movl %eax, 0x64(%rsp)
movq 0x1a8(%rsp), %rax
movq 0x98(%rax), %rdi
callq 0x29610
movq 0x58(%rsp), %rdi
movl 0x64(%rsp), %esi
movl %eax, %edx
callq 0x2f440
jmp 0xee1f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x178(%rsp)
movl %eax, 0x174(%rsp)
leaq 0x180(%rsp), %rdi
callq 0x6778
jmp 0xf24b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x178(%rsp)
movl %eax, 0x174(%rsp)
leaq 0x150(%rsp), %rdi
callq 0x6778
jmp 0xf24b
movq 0x1b8(%rsp), %rdi
movq 0x1a8(%rsp), %rax
movq 0x98(%rax), %rsi
callq 0x2a1f0
jmp 0xee21
jmp 0xee23
movl 0x1b0(%rsp), %eax
addl $0x1, %eax
movl %eax, 0x1b0(%rsp)
jmp 0xeb42
movq 0x1b8(%rsp), %rax
movq %rax, 0x48(%rsp)
leaq 0x127(%rsp), %rdi
movq %rdi, 0x50(%rsp)
callq 0x66c0
movq 0x50(%rsp), %rdx
leaq 0x43d01(%rip), %rsi     # 0x52b65
leaq 0x128(%rsp), %rdi
callq 0x7500
jmp 0xee73
movq 0x48(%rsp), %rdi
xorl %eax, %eax
movl %eax, %edx
leaq 0x128(%rsp), %rsi
callq 0x2a040
movq %rax, 0x40(%rsp)
jmp 0xee90
leaq 0x128(%rsp), %rdi
callq 0x6778
leaq 0x127(%rsp), %rdi
callq 0x6400
movq 0x40(%rsp), %rax
movq %rax, 0x148(%rsp)
cmpq $0x0, 0x148(%rsp)
jne 0xef4f
leaq 0x5f60b(%rip), %rax     # 0x6e4d8
movq (%rax), %rdi
addq $0x38, %rdi
addq $0x10, %rdi
leaq 0x43c8b(%rip), %rsi     # 0x52b6a
callq 0x6370
leaq 0x5f5ed(%rip), %rax     # 0x6e4d8
movq (%rax), %rdi
leaq 0x5f4db(%rip), %rax     # 0x6e3d0
movl (%rax), %esi
addl $0x1, %esi
xorl %edx, %edx
callq 0x2f440
jmp 0xf034
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x178(%rsp)
movl %eax, 0x174(%rsp)
jmp 0xef3d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x178(%rsp)
movl %eax, 0x174(%rsp)
leaq 0x128(%rsp), %rdi
callq 0x6778
leaq 0x127(%rsp), %rdi
callq 0x6400
jmp 0xf24b
movq 0x148(%rsp), %rdi
callq 0x295f0
cmpl $0x2, %eax
je 0xefbe
leaq 0x5f570(%rip), %rax     # 0x6e4d8
movq (%rax), %rdi
addq $0x38, %rdi
addq $0x10, %rdi
leaq 0x43c15(%rip), %rsi     # 0x52b8f
callq 0x6370
leaq 0x5f552(%rip), %rax     # 0x6e4d8
movq (%rax), %rax
movq %rax, 0x30(%rsp)
movq 0x148(%rsp), %rdi
callq 0x29600
movl %eax, 0x3c(%rsp)
movq 0x148(%rsp), %rdi
callq 0x29610
movq 0x30(%rsp), %rdi
movl 0x3c(%rsp), %esi
movl %eax, %edx
callq 0x2f440
jmp 0xf032
movq 0x148(%rsp), %rdi
addq $0x78, %rdi
callq 0x20540
cmpq $0x0, %rax
je 0xf030
leaq 0x5f4fc(%rip), %rax     # 0x6e4d8
movq (%rax), %rdi
addq $0x38, %rdi
addq $0x10, %rdi
leaq 0x43bc7(%rip), %rsi     # 0x52bb5
callq 0x6370
leaq 0x5f4de(%rip), %rax     # 0x6e4d8
movq (%rax), %rax
movq %rax, 0x20(%rsp)
movq 0x148(%rsp), %rdi
callq 0x29600
movl %eax, 0x2c(%rsp)
movq 0x148(%rsp), %rdi
callq 0x29610
movq 0x20(%rsp), %rdi
movl 0x2c(%rsp), %esi
movl %eax, %edx
callq 0x2f440
jmp 0xf032
jmp 0xf034
leaq 0x118(%rsp), %rdi
callq 0x20580
movq 0xd0(%rsp), %rdi
addq $0x10, %rdi
callq 0x205a0
movq %rax, 0x110(%rsp)
movq 0x110(%rsp), %rax
movq %rax, 0x118(%rsp)
movq 0xd0(%rsp), %rdi
addq $0x10, %rdi
callq 0x20610
movq %rax, 0x108(%rsp)
leaq 0x118(%rsp), %rdi
leaq 0x108(%rsp), %rsi
callq 0x205d0
testb $0x1, %al
jne 0xf0a1
jmp 0xf243
leaq 0x118(%rsp), %rdi
callq 0x20640
movq (%rax), %rdi
movq 0x1b8(%rsp), %rsi
movq (%rdi), %rax
callq *0x8(%rax)
leaq 0x118(%rsp), %rdi
callq 0x20640
movq (%rax), %rax
movq %rax, 0x18(%rsp)
cmpq $0x0, %rax
jne 0xf0df
callq 0x6420
movq 0x18(%rsp), %rax
movq (%rax), %rax
movq -0x8(%rax), %rdi
leaq 0x5de8e(%rip), %rsi     # 0x6cf80
callq 0x20340
testb $0x1, %al
jne 0xf100
jmp 0xf225
leaq 0x118(%rsp), %rdi
callq 0x20640
movq (%rax), %rax
movq %rax, 0x100(%rsp)
movq 0x100(%rsp), %rax
cmpq $0x0, 0xa0(%rax)
je 0xf223
movq 0x100(%rsp), %rax
movq 0xa0(%rax), %rax
cmpl $0x1, 0x10(%rax)
je 0xf223
movq 0x100(%rsp), %rax
movq 0xa0(%rax), %rdi
movq (%rdi), %rax
callq *0x28(%rax)
testb $0x1, %al
jne 0xf165
jmp 0xf223
leaq 0x5f36c(%rip), %rax     # 0x6e4d8
movq (%rax), %rdi
addq $0x48, %rdi
leaq 0x43a5c(%rip), %rsi     # 0x52bd6
callq 0x6370
movq %rax, (%rsp)
movq 0x100(%rsp), %rax
movq 0x98(%rax), %rsi
leaq 0xe0(%rsp), %rdi
movq %rdi, 0x8(%rsp)
callq 0x295b0
movq (%rsp), %rdi
movq 0x8(%rsp), %rsi
callq 0x6340
movq %rax, 0x10(%rsp)
jmp 0xf1b9
movq 0x10(%rsp), %rdi
leaq 0x43a2f(%rip), %rsi     # 0x52bf4
callq 0x6370
jmp 0xf1cc
leaq 0xe0(%rsp), %rdi
callq 0x6778
leaq 0x5f2f8(%rip), %rax     # 0x6e4d8
movq (%rax), %rdi
movq 0x100(%rsp), %rax
movl 0x8(%rax), %esi
movq 0x100(%rsp), %rax
movl 0xc(%rax), %edx
callq 0x2f440
jmp 0xf223
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x178(%rsp)
movl %eax, 0x174(%rsp)
leaq 0xe0(%rsp), %rdi
callq 0x6778
jmp 0xf24b
jmp 0xf225
jmp 0xf227
leaq 0x118(%rsp), %rdi
xorl %esi, %esi
callq 0x20650
movq %rax, 0xd8(%rsp)
jmp 0xf06a
addq $0x1c8, %rsp            # imm = 0x1C8
retq
movq 0x178(%rsp), %rdi
callq 0x66b0
nopl (%rax,%rax)