// File: dragazo[P]cpp-gc/./GarbageCollection.h
// Function: GC::ptr<ListNode> GC::make<ListNode, 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:
subq $0x88, %rsp
movq %rdi, 0x30(%rsp)
movq %rdi, %rax
movq %rax, 0x38(%rsp)
movq %rdi, 0x80(%rsp)
cmpb $0x0, 0x763f5(%rip)     # 0x9a4f8
jne 0x2417e
leaq 0x763ec(%rip), %rdi     # 0x9a4f8
callq 0x5540
cmpl $0x0, %eax
je 0x2417e
leaq 0x7e(%rsp), %rdi
callq 0x3bdf0
movq %rax, 0x18(%rsp)
leaq 0x7d(%rsp), %rdi
callq 0x3be00
movq %rax, 0x20(%rsp)
leaq 0x7f(%rsp), %rdi
movq %rdi, 0x10(%rsp)
callq 0x3be10
movq 0x10(%rsp), %rdi
movq %rax, 0x28(%rsp)
callq 0x3be20
movq 0x18(%rsp), %rsi
movq 0x20(%rsp), %rdx
movq 0x28(%rsp), %rcx
movq %rax, %r8
leaq 0x7636d(%rip), %rdi     # 0x9a4d8
callq 0x39840
jmp 0x24172
leaq 0x7637f(%rip), %rdi     # 0x9a4f8
callq 0x51d0
movl $0x1f0, %edi            # imm = 0x1F0
callq 0x39890
movq %rax, 0x60(%rsp)
movq 0x60(%rsp), %rax
movq %rax, 0x58(%rsp)
movq 0x60(%rsp), %rax
addq $0x1b0, %rax            # imm = 0x1B0
movq %rax, 0x50(%rsp)
movq 0x58(%rsp), %rdi
callq 0x2e780
jmp 0x241b3
jmp 0x2421c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x70(%rsp)
movl %eax, 0x6c(%rsp)
leaq 0x7632e(%rip), %rdi     # 0x9a4f8
callq 0x51c0
jmp 0x242c0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x70(%rsp)
movl %eax, 0x6c(%rsp)
movq 0x70(%rsp), %rdi
callq 0x5110
movq 0x60(%rsp), %rdi
callq 0x39a70
jmp 0x241f8
callq 0x5450
jmp 0x242d2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x70(%rsp)
movl %eax, 0x6c(%rsp)
callq 0x54b0
jmp 0x24217
jmp 0x242c0
movq 0x50(%rsp), %rdi
movq 0x58(%rsp), %rsi
leaq 0x762ab(%rip), %rcx     # 0x9a4d8
movl $0x1, %edx
callq 0x39950
movq 0x50(%rsp), %rax
movq %rax, 0x8(%rsp)
leaq -0x1b4d8(%rip), %rsi    # 0x8d70
leaq 0x48(%rsp), %rdi
callq 0x9580
movq 0x8(%rsp), %rdi
movq 0x48(%rsp), %rsi
callq 0x9550
movq 0x30(%rsp), %rdi
movb $0x0, 0x47(%rsp)
movq 0x58(%rsp), %rsi
movq 0x50(%rsp), %rdx
callq 0x3be30
callq 0x8e10
jmp 0x24281
movb $0x1, 0x47(%rsp)
testb $0x1, 0x47(%rsp)
jne 0x242b3
jmp 0x242a9
movq 0x30(%rsp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, 0x70(%rsp)
movl %eax, 0x6c(%rsp)
callq 0x24330
jmp 0x242c0
movq 0x30(%rsp), %rdi
callq 0x24330
movq 0x38(%rsp), %rax
addq $0x88, %rsp
retq
movq 0x70(%rsp), %rdi
callq 0x5510
movq %rax, %rdi
callq 0x9480
nopw %cs:(%rax,%rax)
nopl (%rax)