// File: /workspace/github_c_makefile_star2_O0/naleksiev[P]fin/src/fin_ast.c
// Function: fin_ast_expr_destroy
static void fin_ast_expr_destroy(fin_ast_module_t* mod, fin_ast_expr_t* expr) {
    if (!expr)
        return;
    switch (expr->type) {
        case fin_ast_expr_type_id: {
            fin_ast_id_expr_t* id_expr = (fin_ast_id_expr_t*)expr;
            fin_ast_expr_destroy(mod, id_expr->primary);
            fin_str_destroy(mod->ctx, id_expr->name);
            break;
        }
        case fin_ast_expr_type_bool: {
            break;
        }
        case fin_ast_expr_type_int: {
            break;
        }
        case fin_ast_expr_type_float: {
            break;
        }
        case fin_ast_expr_type_str: {
            fin_ast_str_expr_t* str_expr = (fin_ast_str_expr_t*)expr;
            if (str_expr->value)
                fin_str_destroy(mod->ctx, str_expr->value);
            break;
        }
        case fin_ast_expr_type_str_interp: {
            fin_ast_str_interp_expr_t* interp_expr = (fin_ast_str_interp_expr_t*)expr;
            fin_ast_expr_destroy(mod, &interp_expr->next->base);
            fin_ast_expr_destroy(mod, interp_expr->expr);
            break;
        }
        case fin_ast_expr_type_unary: {
            fin_ast_unary_expr_t* un_expr = (fin_ast_unary_expr_t*)expr;
            fin_ast_expr_destroy(mod, un_expr->expr);
            break;
        }
        case fin_ast_expr_type_binary: {
            fin_ast_binary_expr_t* bin_expr = (fin_ast_binary_expr_t*)expr;
            fin_ast_expr_destroy(mod, bin_expr->lhs);
            fin_ast_expr_destroy(mod, bin_expr->rhs);
            break;
        }
        case fin_ast_expr_type_cond: {
            fin_ast_cond_expr_t* cond_expr = (fin_ast_cond_expr_t*)expr;
            fin_ast_expr_destroy(mod, cond_expr->cond);
            fin_ast_expr_destroy(mod, cond_expr->true_expr);
            if (cond_expr->false_expr)
                fin_ast_expr_destroy(mod, cond_expr->false_expr);
            break;
        }
        case fin_ast_expr_type_arg: {
            fin_ast_arg_expr_t* arg_expr = (fin_ast_arg_expr_t*)expr;
            fin_ast_expr_destroy(mod, &arg_expr->next->base);
            fin_ast_expr_destroy(mod, arg_expr->expr);
            break;
        }
        case fin_ast_expr_type_invoke: {
            fin_ast_invoke_expr_t* invoke_expr = (fin_ast_invoke_expr_t*)expr;
            fin_ast_expr_destroy(mod, invoke_expr->id);
            fin_ast_expr_destroy(mod, &invoke_expr->args->base);
            break;
        }
        case fin_ast_expr_type_init: {
            fin_ast_init_expr_t* init_expr = (fin_ast_init_expr_t*)expr;
            fin_ast_expr_destroy(mod, &init_expr->args->base);
            break;
        }
        case fin_ast_expr_type_assign: {
            fin_ast_assign_expr_t* assign_expr = (fin_ast_assign_expr_t*)expr;
            fin_ast_expr_destroy(mod, assign_expr->lhs);
            fin_ast_expr_destroy(mod, assign_expr->rhs);
            break;
        }
    }
    mod->ctx->alloc(expr, 0);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
cmpq $0x0, -0x10(%rbp)
jne 0x5e2c
jmp 0x6037
movq -0x10(%rbp), %rax
movl (%rax), %eax
movq %rax, -0x68(%rbp)
subq $0xc, %rax
ja 0x6025
movq -0x68(%rbp), %rax
leaq 0x738d(%rip), %rcx      # 0xd1d8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x10(%rbp), %rax
movq %rax, -0x18(%rbp)
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x5e10
movq -0x8(%rbp), %rax
movq (%rax), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rsi
callq 0xb0b0
jmp 0x6025
jmp 0x6025
jmp 0x6025
jmp 0x6025
movq -0x10(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
cmpq $0x0, 0x8(%rax)
je 0x5ebc
movq -0x8(%rbp), %rax
movq (%rax), %rdi
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0xb0b0
jmp 0x6025
movq -0x10(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rsi
callq 0x5e10
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x5e10
jmp 0x6025
movq -0x10(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x5e10
jmp 0x6025
movq -0x10(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x8(%rbp), %rdi
movq -0x38(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x5e10
movq -0x8(%rbp), %rdi
movq -0x38(%rbp), %rax
movq 0x10(%rax), %rsi
callq 0x5e10
jmp 0x6025
movq -0x10(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x5e10
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rax
movq 0x10(%rax), %rsi
callq 0x5e10
movq -0x40(%rbp), %rax
cmpq $0x0, 0x18(%rax)
je 0x5f83
movq -0x8(%rbp), %rdi
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rsi
callq 0x5e10
jmp 0x6025
movq -0x10(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x8(%rbp), %rdi
movq -0x48(%rbp), %rax
movq 0x10(%rax), %rsi
callq 0x5e10
movq -0x8(%rbp), %rdi
movq -0x48(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x5e10
jmp 0x6025
movq -0x10(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x8(%rbp), %rdi
movq -0x50(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x5e10
movq -0x8(%rbp), %rdi
movq -0x50(%rbp), %rax
movq 0x10(%rax), %rsi
callq 0x5e10
jmp 0x6025
movq -0x10(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x8(%rbp), %rdi
movq -0x58(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x5e10
jmp 0x6025
movq -0x10(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x8(%rbp), %rdi
movq -0x60(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x5e10
movq -0x8(%rbp), %rdi
movq -0x60(%rbp), %rax
movq 0x10(%rax), %rsi
callq 0x5e10
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq (%rax), %rax
movq -0x10(%rbp), %rdi
xorl %esi, %esi
callq *%rax
addq $0x70, %rsp
popq %rbp
retq
nopl (%rax)