// File: /workspace/github_c_makefile_star2_O0/BernardTatin[P]s7sh/s7.c
// Function: copy_source_no_dest
static s7_pointer copy_source_no_dest(s7_scheme *sc, s7_pointer caller, s7_pointer source, s7_pointer args)
                {
                    s7_pointer dest;
                    switch (type(source))
                    {
                        case T_STRING:
                            return(make_string_with_length(sc, string_value(source), string_length(source)));

                        case T_C_OBJECT:
                            return(copy_c_object(sc, args));

                        case T_RANDOM_STATE:
                            return(rng_copy(sc, args));

                        case T_HASH_TABLE:              /* this has to copy nearly everything */
                            {
                                s7_int gc_loc;
                                s7_pointer new_hash;
                                new_hash = s7_make_hash_table(sc, hash_table_mask(source) + 1);
                                gc_loc = s7_gc_protect_1(sc, new_hash);
                                hash_table_checker(new_hash) = hash_table_checker(source);
                                if (hash_chosen(source)) hash_set_chosen(new_hash);
                                hash_table_mapper(new_hash) = hash_table_mapper(source);
                                hash_table_set_procedures(new_hash, hash_table_procedures(source));
                                hash_table_copy(sc, source, new_hash, 0, hash_table_entries(source));
                                if (is_typed_hash_table(source))
                                {
                                    set_typed_hash_table(new_hash);
                                    if (has_simple_keys(source))
                                        set_has_simple_keys(new_hash);
                                    if (has_simple_values(source))
                                        set_has_simple_values(new_hash);
                                }
                                s7_gc_unprotect_at(sc, gc_loc);
                                return(new_hash);
                            }

                        case T_ITERATOR:
                            return(iterator_copy(sc, source));

                        case T_LET:
                            check_method(sc, source, sc->copy_symbol, args);
                            return(let_copy(sc, source));   /* this copies only the local env and points to outer envs */

                        case T_CLOSURE: case T_CLOSURE_STAR:
                        case T_MACRO:   case T_MACRO_STAR:
                        case T_BACRO:   case T_BACRO_STAR:
                            check_method(sc, source, sc->copy_symbol, args);
                            return(copy_closure(sc, source));

                        case T_INT_VECTOR: case T_FLOAT_VECTOR: case T_VECTOR: case T_BYTE_VECTOR:
                            return(s7_vector_copy(sc, source)); /* "shallow" copy */

                        case T_PAIR:                    /* top level only, as in the other cases, last arg checks for circles */
                            return(protected_list_copy(sc, source));

                        case T_INTEGER:
                            new_cell(sc, dest, T_INTEGER);
                            integer(dest) = integer(source);
                            return(dest);

                        case T_RATIO:
                            new_cell(sc, dest, T_RATIO);
                            numerator(dest) = numerator(source);
                            denominator(dest) = denominator(source);
                            return(dest);

                        case T_REAL:
                            new_cell(sc, dest, T_REAL);
                            set_real(dest, real(source));
                            return(dest);

                        case T_COMPLEX:
                            new_cell(sc, dest, T_COMPLEX);
                            set_real_part(dest, real_part(source));
                            set_imag_part(dest, imag_part(source));
                            return(dest);

#if WITH_GMP
                        case T_BIG_INTEGER: return(mpz_to_big_integer(sc, big_integer(source)));
                        case T_BIG_RATIO:   return(mpq_to_big_ratio(sc, big_ratio(source)));
                        case T_BIG_REAL:    return(mpfr_to_big_real(sc, big_real(source)));
                        case T_BIG_COMPLEX: return(mpc_to_big_complex(sc, big_complex(source)));
#endif

                        case T_C_POINTER:
                                            dest = s7_make_c_pointer_with_type(sc, c_pointer(source), c_pointer_type(source), c_pointer_info(source));
                                            c_pointer_weak1(dest) = c_pointer_weak1(source);
                                            c_pointer_weak2(dest) = c_pointer_weak2(source);
                                            return(dest);
                    }
                    return(source);
                }

// Assembly:
subq $0x88, %rsp
movq %rdi, 0x78(%rsp)
movq %rsi, 0x70(%rsp)
movq %rdx, 0x68(%rsp)
movq %rcx, 0x60(%rsp)
movq 0x68(%rsp), %rax
movzbl (%rax), %eax
decl %eax
movl %eax, %ecx
movq %rcx, 0x30(%rsp)
subl $0x2c, %eax
ja 0xda1d3
movq 0x30(%rsp), %rax
leaq 0x105db7(%rip), %rcx    # 0x1df988
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x78(%rsp), %rdi
movq 0x68(%rsp), %rax
movq 0x10(%rax), %rsi
movq 0x68(%rsp), %rax
movq 0x8(%rax), %rdx
callq 0x144d0
movq %rax, 0x80(%rsp)
jmp 0xda1e0
movq 0x78(%rsp), %rdi
movq 0x60(%rsp), %rsi
callq 0xdb5f0
movq %rax, 0x80(%rsp)
jmp 0xda1e0
movq 0x78(%rsp), %rdi
movq 0x60(%rsp), %rsi
callq 0xdb780
movq %rax, 0x80(%rsp)
jmp 0xda1e0
movq 0x78(%rsp), %rdi
movq 0x68(%rsp), %rax
movq 0x8(%rax), %rsi
addq $0x1, %rsi
callq 0x2a440
movq %rax, 0x48(%rsp)
movq 0x78(%rsp), %rdi
movq 0x48(%rsp), %rsi
callq 0x9cb0
movq %rax, 0x50(%rsp)
movq 0x68(%rsp), %rax
movq 0x18(%rax), %rcx
movq 0x48(%rsp), %rax
movq %rcx, 0x18(%rax)
movq 0x68(%rsp), %rax
movq (%rax), %rax
andq $0x20000000, %rax       # imm = 0x20000000
cmpq $0x0, %rax
je 0xd9ca3
movq 0x48(%rsp), %rax
movq (%rax), %rcx
orq $0x20000000, %rcx       # imm = 0x20000000
movq %rcx, (%rax)
movq 0x68(%rsp), %rax
movq 0x20(%rax), %rcx
movq 0x48(%rsp), %rax
movq %rcx, 0x20(%rax)
movq 0x68(%rsp), %rax
movq 0x28(%rax), %rax
movq 0x20(%rax), %rcx
movq 0x48(%rsp), %rax
movq 0x28(%rax), %rax
movq %rcx, 0x20(%rax)
movq 0x78(%rsp), %rdi
movq 0x68(%rsp), %rsi
movq 0x48(%rsp), %rdx
movq 0x68(%rsp), %rax
movq 0x28(%rax), %rax
movq 0x18(%rax), %r8
xorl %eax, %eax
movl %eax, %ecx
callq 0xdb850
movq 0x68(%rsp), %rax
movzwl 0x6(%rax), %eax
andl $0x2, %eax
cmpl $0x0, %eax
je 0xd9d5e
movq 0x48(%rsp), %rax
movzwl 0x6(%rax), %ecx
orl $0x2, %ecx
movw %cx, 0x6(%rax)
movq 0x68(%rsp), %rax
movzwl 0x6(%rax), %eax
andl $0x100, %eax            # imm = 0x100
cmpl $0x0, %eax
je 0xd9d3b
movq 0x48(%rsp), %rax
movzwl 0x6(%rax), %ecx
orl $0x100, %ecx            # imm = 0x100
movw %cx, 0x6(%rax)
movq 0x68(%rsp), %rax
movzwl 0x6(%rax), %eax
andl $0x8, %eax
cmpl $0x0, %eax
je 0xd9d5c
movq 0x48(%rsp), %rax
movzwl 0x6(%rax), %ecx
orl $0x8, %ecx
movw %cx, 0x6(%rax)
jmp 0xd9d5e
movq 0x78(%rsp), %rdi
movq 0x50(%rsp), %rsi
callq 0x9f60
movq 0x48(%rsp), %rax
movq %rax, 0x80(%rsp)
jmp 0xda1e0
movq 0x78(%rsp), %rdi
movq 0x68(%rsp), %rsi
callq 0xdbde0
movq %rax, 0x80(%rsp)
jmp 0xda1e0
movq 0x68(%rsp), %rax
movq (%rax), %rax
andq $0x40000000, %rax       # imm = 0x40000000
cmpq $0x0, %rax
je 0xd9e4c
movq 0x78(%rsp), %rax
testb $0x1, 0x24c(%rax)
je 0xd9e4c
movq 0x78(%rsp), %rax
movq %rax, 0x28(%rsp)
movq 0x78(%rsp), %rdi
movq 0x68(%rsp), %rsi
callq 0x9a10
movq 0x28(%rsp), %rdi
movq %rax, %rsi
movq 0x78(%rsp), %rax
movq 0xe20(%rax), %rdx
callq 0x98d0
movq %rax, 0x40(%rsp)
movq 0x78(%rsp), %rcx
cmpq 0x128(%rcx), %rax
je 0xd9e4c
movq 0x78(%rsp), %rax
movq %rax, 0x18(%rsp)
movq 0x40(%rsp), %rax
movq %rax, 0x20(%rsp)
movq 0x78(%rsp), %rdi
movq 0x60(%rsp), %rsi
callq 0x44270
movq 0x18(%rsp), %rdi
movq 0x20(%rsp), %rsi
movq %rax, %rdx
callq 0xda50
movq %rax, 0x80(%rsp)
jmp 0xda1e0
movq 0x78(%rsp), %rdi
movq 0x68(%rsp), %rsi
callq 0xdbe60
movq %rax, 0x80(%rsp)
jmp 0xda1e0
movq 0x68(%rsp), %rax
movq (%rax), %rax
andq $0x40000000, %rax       # imm = 0x40000000
cmpq $0x0, %rax
je 0xd9f17
movq 0x78(%rsp), %rax
testb $0x1, 0x24c(%rax)
je 0xd9f17
movq 0x78(%rsp), %rax
movq %rax, 0x10(%rsp)
movq 0x78(%rsp), %rdi
movq 0x68(%rsp), %rsi
callq 0x9a10
movq 0x10(%rsp), %rdi
movq %rax, %rsi
movq 0x78(%rsp), %rax
movq 0xe20(%rax), %rdx
callq 0x98d0
movq %rax, 0x38(%rsp)
movq 0x78(%rsp), %rcx
cmpq 0x128(%rcx), %rax
je 0xd9f17
movq 0x78(%rsp), %rax
movq %rax, (%rsp)
movq 0x38(%rsp), %rax
movq %rax, 0x8(%rsp)
movq 0x78(%rsp), %rdi
movq 0x60(%rsp), %rsi
callq 0x44270
movq (%rsp), %rdi
movq 0x8(%rsp), %rsi
movq %rax, %rdx
callq 0xda50
movq %rax, 0x80(%rsp)
jmp 0xda1e0
movq 0x78(%rsp), %rdi
movq 0x68(%rsp), %rsi
callq 0xdc0d0
movq %rax, 0x80(%rsp)
jmp 0xda1e0
movq 0x78(%rsp), %rdi
movq 0x68(%rsp), %rsi
callq 0x34ee0
movq %rax, 0x80(%rsp)
jmp 0xda1e0
movq 0x78(%rsp), %rdi
movq 0x68(%rsp), %rsi
callq 0xc5ed0
movq %rax, 0x80(%rsp)
jmp 0xda1e0
jmp 0xd9f6d
movq 0x78(%rsp), %rax
movq 0x90(%rax), %rax
movq 0x78(%rsp), %rcx
cmpq 0x98(%rcx), %rax
ja 0xd9f91
movq 0x78(%rsp), %rdi
callq 0xc670
movq 0x78(%rsp), %rcx
movq 0x90(%rcx), %rax
movq %rax, %rdx
addq $-0x8, %rdx
movq %rdx, 0x90(%rcx)
movq -0x8(%rax), %rax
movq %rax, 0x58(%rsp)
movq 0x58(%rsp), %rax
movq $0xb, (%rax)
movq 0x68(%rsp), %rax
movq 0x8(%rax), %rcx
movq 0x58(%rsp), %rax
movq %rcx, 0x8(%rax)
movq 0x58(%rsp), %rax
movq %rax, 0x80(%rsp)
jmp 0xda1e0
jmp 0xd9fe6
movq 0x78(%rsp), %rax
movq 0x90(%rax), %rax
movq 0x78(%rsp), %rcx
cmpq 0x98(%rcx), %rax
ja 0xda00a
movq 0x78(%rsp), %rdi
callq 0xc670
movq 0x78(%rsp), %rcx
movq 0x90(%rcx), %rax
movq %rax, %rdx
addq $-0x8, %rdx
movq %rdx, 0x90(%rcx)
movq -0x8(%rax), %rax
movq %rax, 0x58(%rsp)
movq 0x58(%rsp), %rax
movq $0xc, (%rax)
movq 0x68(%rsp), %rax
movq 0x8(%rax), %rcx
movq 0x58(%rsp), %rax
movq %rcx, 0x8(%rax)
movq 0x68(%rsp), %rax
movq 0x10(%rax), %rcx
movq 0x58(%rsp), %rax
movq %rcx, 0x10(%rax)
movq 0x58(%rsp), %rax
movq %rax, 0x80(%rsp)
jmp 0xda1e0
jmp 0xda071
movq 0x78(%rsp), %rax
movq 0x90(%rax), %rax
movq 0x78(%rsp), %rcx
cmpq 0x98(%rcx), %rax
ja 0xda095
movq 0x78(%rsp), %rdi
callq 0xc670
movq 0x78(%rsp), %rcx
movq 0x90(%rcx), %rax
movq %rax, %rdx
addq $-0x8, %rdx
movq %rdx, 0x90(%rcx)
movq -0x8(%rax), %rax
movq %rax, 0x58(%rsp)
movq 0x58(%rsp), %rax
movq $0xd, (%rax)
movq 0x68(%rsp), %rax
movsd 0x8(%rax), %xmm0
movq 0x58(%rsp), %rax
movsd %xmm0, 0x8(%rax)
movq 0x58(%rsp), %rax
movq %rax, 0x80(%rsp)
jmp 0xda1e0
jmp 0xda0ec
movq 0x78(%rsp), %rax
movq 0x90(%rax), %rax
movq 0x78(%rsp), %rcx
cmpq 0x98(%rcx), %rax
ja 0xda110
movq 0x78(%rsp), %rdi
callq 0xc670
movq 0x78(%rsp), %rcx
movq 0x90(%rcx), %rax
movq %rax, %rdx
addq $-0x8, %rdx
movq %rdx, 0x90(%rcx)
movq -0x8(%rax), %rax
movq %rax, 0x58(%rsp)
movq 0x58(%rsp), %rax
movq $0xe, (%rax)
movq 0x68(%rsp), %rax
movsd 0x8(%rax), %xmm0
movq 0x58(%rsp), %rax
movsd %xmm0, 0x8(%rax)
movq 0x68(%rsp), %rax
movsd 0x10(%rax), %xmm0
movq 0x58(%rsp), %rax
movsd %xmm0, 0x10(%rax)
movq 0x58(%rsp), %rax
movq %rax, 0x80(%rsp)
jmp 0xda1e0
movq 0x78(%rsp), %rdi
movq 0x68(%rsp), %rax
movq 0x8(%rax), %rsi
movq 0x68(%rsp), %rax
movq 0x10(%rax), %rdx
movq 0x68(%rsp), %rax
movq 0x18(%rax), %rcx
callq 0x107d0
movq %rax, 0x58(%rsp)
movq 0x68(%rsp), %rax
movq 0x20(%rax), %rcx
movq 0x58(%rsp), %rax
movq %rcx, 0x20(%rax)
movq 0x68(%rsp), %rax
movq 0x28(%rax), %rcx
movq 0x58(%rsp), %rax
movq %rcx, 0x28(%rax)
movq 0x58(%rsp), %rax
movq %rax, 0x80(%rsp)
jmp 0xda1e0
movq 0x68(%rsp), %rax
movq %rax, 0x80(%rsp)
movq 0x80(%rsp), %rax
addq $0x88, %rsp
retq