// File: /workspace/github_c_makefile_star2_O0/martincameron[P]towntalk/towntalk.c
// Function: execute_try_finally_statement
static enum result execute_try_finally_statement( struct statement *this,
	struct variables *vars, struct variable *result ) {
	enum result try_ret, fin_ret;
	struct variables try_vars, fin_vars;
	struct variable try_exc = { 0 }, try_res = { 0 };
	struct variable fin_exc = { 0 }, fin_res = { 0 };
	try_vars.parent = fin_vars.parent = vars->parent;
	try_vars.exception = &try_exc;
	fin_vars.exception = &fin_exc;
	try_vars.locals = fin_vars.locals = vars->locals;
	try_vars.func = fin_vars.func = vars->func;
	try_vars.line = fin_vars.line = vars->line;
	try_ret = execute_statements( ( ( struct block_statement * ) this )->if_block, &try_vars, &try_res );
	fin_ret = execute_statements( ( ( struct block_statement * ) this )->else_block, &fin_vars, &fin_res );
	if( try_ret == OKAY ) {
		if( fin_ret == OKAY ) {
			return OKAY;
		} else if( fin_ret == RETURN ) {
			assign_variable( &fin_res, result );
			dispose_temporary( &fin_res );
		} else if( fin_ret == EXCEPTION ) {
			assign_variable( fin_vars.exception, vars->exception );
			dispose_temporary( fin_vars.exception );
		}
		return fin_ret;
	}
	if( try_ret == RETURN ) {
		if( fin_ret == OKAY ) {
			assign_variable( &try_res, result );
			dispose_temporary( &try_res );
			return RETURN;
		} else if( fin_ret == EXCEPTION ) {
			assign_variable( fin_vars.exception, vars->exception );
			dispose_temporary( fin_vars.exception );
		} else if( fin_ret == RETURN ) {
			assign_variable( &fin_res, result );
			dispose_temporary( &fin_res );
		}
		dispose_temporary( &try_res );
		return fin_ret;
	}
	if( try_ret == EXCEPTION ) {
		if( fin_ret == EXCEPTION ) {
			if( is_exit( fin_vars.exception ) ) {
				assign_variable( fin_vars.exception, vars->exception );
				dispose_temporary( try_vars.exception );
				dispose_temporary( fin_vars.exception );
				return EXCEPTION;
			}
			dispose_temporary( fin_vars.exception );
		} else if( fin_ret == RETURN ) {
			dispose_temporary( &fin_res );
		}
		assign_variable( try_vars.exception, vars->exception );
		dispose_temporary( try_vars.exception );
	}
	return try_ret;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xc0, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
leaq -0x88(%rbp), %rdi
xorl %esi, %esi
movl $0x10, %edx
callq 0x30f0
leaq -0x98(%rbp), %rdi
xorl %esi, %esi
movl $0x10, %edx
callq 0x30f0
leaq -0xa8(%rbp), %rdi
xorl %esi, %esi
movl $0x10, %edx
callq 0x30f0
leaq -0xb8(%rbp), %rdi
xorl %esi, %esi
movl $0x10, %edx
callq 0x30f0
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x78(%rbp)
movq %rax, -0x50(%rbp)
leaq -0x88(%rbp), %rax
movq %rax, -0x48(%rbp)
leaq -0xa8(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x68(%rbp)
movq %rax, -0x40(%rbp)
movq -0x18(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x60(%rbp)
movq %rax, -0x38(%rbp)
movq -0x18(%rbp), %rax
movl 0x20(%rax), %eax
movl %eax, -0x58(%rbp)
movl %eax, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdi
leaq -0x50(%rbp), %rsi
leaq -0x98(%rbp), %rdx
callq 0x10a90
movl %eax, -0x24(%rbp)
movq -0x10(%rbp), %rax
movq 0x30(%rax), %rdi
leaq -0x78(%rbp), %rsi
leaq -0xb8(%rbp), %rdx
callq 0x10a90
movl %eax, -0x28(%rbp)
cmpl $0x1, -0x24(%rbp)
jne 0x10966
cmpl $0x1, -0x28(%rbp)
jne 0x10913
movl $0x1, -0x4(%rbp)
jmp 0x10a82
cmpl $0x2, -0x28(%rbp)
jne 0x10937
movq -0x20(%rbp), %rsi
leaq -0xb8(%rbp), %rdi
callq 0x3d10
leaq -0xb8(%rbp), %rdi
callq 0x3ce0
jmp 0x10959
cmpl $0x0, -0x28(%rbp)
jne 0x10957
movq -0x70(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x3d10
movq -0x70(%rbp), %rdi
callq 0x3ce0
jmp 0x10959
jmp 0x1095b
movl -0x28(%rbp), %eax
movl %eax, -0x4(%rbp)
jmp 0x10a82
cmpl $0x2, -0x24(%rbp)
jne 0x109fd
cmpl $0x1, -0x28(%rbp)
jne 0x1099e
movq -0x20(%rbp), %rsi
leaq -0x98(%rbp), %rdi
callq 0x3d10
leaq -0x98(%rbp), %rdi
callq 0x3ce0
movl $0x2, -0x4(%rbp)
jmp 0x10a82
cmpl $0x0, -0x28(%rbp)
jne 0x109c0
movq -0x70(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x3d10
movq -0x70(%rbp), %rdi
callq 0x3ce0
jmp 0x109e4
cmpl $0x2, -0x28(%rbp)
jne 0x109e2
movq -0x20(%rbp), %rsi
leaq -0xb8(%rbp), %rdi
callq 0x3d10
leaq -0xb8(%rbp), %rdi
callq 0x3ce0
jmp 0x109e4
jmp 0x109e6
leaq -0x98(%rbp), %rdi
callq 0x3ce0
movl -0x28(%rbp), %eax
movl %eax, -0x4(%rbp)
jmp 0x10a82
cmpl $0x0, -0x24(%rbp)
jne 0x10a7c
cmpl $0x0, -0x28(%rbp)
jne 0x10a4e
movq -0x70(%rbp), %rdi
callq 0x10b00
cmpl $0x0, %eax
je 0x10a43
movq -0x70(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x3d10
movq -0x48(%rbp), %rdi
callq 0x3ce0
movq -0x70(%rbp), %rdi
callq 0x3ce0
movl $0x0, -0x4(%rbp)
jmp 0x10a82
movq -0x70(%rbp), %rdi
callq 0x3ce0
jmp 0x10a62
cmpl $0x2, -0x28(%rbp)
jne 0x10a60
leaq -0xb8(%rbp), %rdi
callq 0x3ce0
jmp 0x10a62
movq -0x48(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rsi
callq 0x3d10
movq -0x48(%rbp), %rdi
callq 0x3ce0
movl -0x24(%rbp), %eax
movl %eax, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0xc0, %rsp
popq %rbp
retq
nop