// File: /workspace/github_cpp_makefile_star2_O3/dragazo[P]cpp-gc/./GarbageCollection.h
// Function: GC::ptr<__gc_variant<std::recursive_mutex, SymbolTable>> GC::make<__gc_variant<std::recursive_mutex, SymbolTable>, 0>()
[[nodiscard]]
	static ptr<T> make(Args &&...args)
	{
		// -- normalize T -- //

		// strip cv qualifiers
		typedef std::remove_cv_t<T> element_type;
		
		// get the allocator
		typedef checked_aligned_allocator_for<element_type, info> allocator_t;

		// -- create the vtable -- //

		// use lambda to conveniently create the set of all router functions for type T
		auto router_set = [](info &handle, auto func) { GC::route(*reinterpret_cast<element_type*>(handle.obj), func); };

		static const info_vtable _vtable(
			[](info &handle) { reinterpret_cast<element_type*>(handle.obj)->~element_type(); },
			[](info &handle) { allocator_t::dealloc(handle.obj); },
			router_set,
			router_set
		);

		// -- create the buffer for both the object and its info object -- //

		// alias the pad size type
		typedef pad_size_for_info<element_type, 1> pad_size;

		// allocate the buffer space
		void *const buf = allocator_t::alloc(pad_size::value + sizeof(info));

		// alias the buffer partitions
		element_type *const obj = reinterpret_cast<element_type*>(buf);
		info         *const handle = reinterpret_cast<info*>(reinterpret_cast<char*>(buf) + pad_size::value);

		// -- construct the object -- //

		// try to construct the object
		try { new (obj) element_type(std::forward<Args>(args)...); }
		// if that fails, deallocate buf and rethrow
		catch (...) { allocator_t::dealloc(buf); throw; }

		// construct the info object
		new (handle) info(obj, 1, &_vtable);

		// -- do the garbage collection aspects -- //

		// claim its children
		handle->route(GC::router_unroot);

		// create the ptr first - this roots obj
		ptr<T> res(obj, handle, GC::bind_new_obj);

		// begin timed collection (if it's not already)
		GC::start_timed_collect();

		// return the now-initialized ptr
		return res;
	}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
movq %rdi, %rbx
movb 0x1e763(%rip), %al      # 0x31908
testb %al, %al
je 0x132d7
movl $0x130, %edi            # imm = 0x130
callq 0x1725a
movq %rax, %r14
xorps %xmm0, %xmm0
movups %xmm0, 0xd8(%rax)
movups %xmm0, 0xc8(%rax)
xorl %r15d, %r15d
movq %r15, 0xe8(%rax)
movl $0x1, %ebp
movl %ebp, 0xd8(%rax)
leaq 0x20(%rax), %rdi
leaq 0x30(%rax), %r12
movl $0xa8, %edx
xorl %esi, %esi
callq 0x4150
movq %r12, (%r14)
movl $0x1, %eax
movq %rax, 0x8(%r14)
xorps %xmm0, %xmm0
movups %xmm0, 0x10(%r14)
movl $0x3f800000, %ecx       # imm = 0x3F800000
movl %ecx, 0x20(%r14)
movups %xmm0, 0xa8(%r14)
movups %xmm0, 0x98(%r14)
movq %r15, 0xb8(%r14)
movups %xmm0, 0x28(%r14)
movups %xmm0, 0x38(%r14)
movups %xmm0, 0x48(%r14)
movq %r15, 0x58(%r14)
movl %ebp, 0xa8(%r14)
leaq 0x90(%r14), %rdx
movq %rdx, 0x60(%r14)
movq %rax, 0x68(%r14)
movups %xmm0, 0x70(%r14)
movl %ecx, 0x80(%r14)
movups %xmm0, 0x88(%r14)
leaq 0xf0(%r14), %r15
movq %r14, 0xf0(%r14)
movq %rax, 0xf8(%r14)
leaq 0x1e667(%rip), %rax     # 0x318e8
movq %rax, 0x100(%r14)
callq 0x7668
movq %rax, 0x108(%r14)
movq 0x100(%r14), %rax
leaq -0xb4ac(%rip), %rsi     # 0x7df6
movq %r15, %rdi
callq *0x10(%rax)
movq %r14, (%rbx)
leaq 0x8(%rbx), %r14
callq 0x7668
movq %rax, 0x10(%rbx)
movq %rax, %rdi
movq %r14, %rsi
movq %r15, %rdx
callq 0x6c4e
callq 0x7e22
movq %rbx, %rax
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
callq 0x50c6
jmp 0x131ad
movq %rax, %r15
movq $0x0, (%rbx)
movq %r14, %rdi
callq 0x17352
movq %r15, %rdi
callq 0x4430
nop