// File: jliesch[P]ofxget/pugixml/pugixml.cpp
// Function: pugi::xml_node::traverse(pugi::xml_tree_walker&)
PUGI__FN bool xml_node::traverse(xml_tree_walker& walker)
	{
		walker._depth = -1;

		xml_node arg_begin(_root);
		if (!walker.begin(arg_begin)) return false;

		xml_node_struct* cur = _root ? _root->first_child + 0 : 0;

		if (cur)
		{
			++walker._depth;

			do
			{
				xml_node arg_for_each(cur);
				if (!walker.for_each(arg_for_each))
					return false;

				if (cur->first_child)
				{
					++walker._depth;
					cur = cur->first_child;
				}
				else if (cur->next_sibling)
					cur = cur->next_sibling;
				else
				{
					while (!cur->next_sibling && cur != _root && cur->parent)
					{
						--walker._depth;
						cur = cur->parent;
					}

					if (cur != _root)
						cur = cur->next_sibling;
				}
			}
			while (cur && cur != _root);
		}

		assert(walker._depth == -1);

		xml_node arg_end(_root);
		return walker.end(arg_end);
	}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x18(%rbp), %rcx
movl $0xffffffff, 0x8(%rcx)  # imm = 0xFFFFFFFF
movq (%rax), %rsi
leaq -0x20(%rbp), %rdi
callq 0x41c10
movq -0x18(%rbp), %rdi
movq (%rdi), %rax
leaq -0x20(%rbp), %rsi
callq *0x10(%rax)
testb $0x1, %al
jne 0x457da
movb $0x0, -0x1(%rbp)
jmp 0x45975
movq -0x40(%rbp), %rax
cmpq $0x0, (%rax)
je 0x457f5
movq -0x40(%rbp), %rax
movq (%rax), %rax
movq 0x20(%rax), %rax
movq %rax, -0x48(%rbp)
jmp 0x457fd
xorl %eax, %eax
movq %rax, -0x48(%rbp)
jmp 0x457fd
movq -0x48(%rbp), %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
je 0x45927
movq -0x18(%rbp), %rax
movl 0x8(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x8(%rax)
movq -0x28(%rbp), %rsi
leaq -0x30(%rbp), %rdi
callq 0x41c10
movq -0x18(%rbp), %rdi
movq (%rdi), %rax
leaq -0x30(%rbp), %rsi
callq *0x18(%rax)
testb $0x1, %al
jne 0x45845
movb $0x0, -0x1(%rbp)
jmp 0x45975
movq -0x28(%rbp), %rax
cmpq $0x0, 0x20(%rax)
je 0x4586e
movq -0x18(%rbp), %rax
movl 0x8(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x8(%rax)
movq -0x28(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x458fb
movq -0x28(%rbp), %rax
cmpq $0x0, 0x30(%rax)
je 0x45887
movq -0x28(%rbp), %rax
movq 0x30(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x458f9
jmp 0x45889
movq -0x28(%rbp), %rcx
xorl %eax, %eax
cmpq $0x0, 0x30(%rcx)
movb %al, -0x49(%rbp)
jne 0x458ba
movq -0x40(%rbp), %rdx
movq -0x28(%rbp), %rcx
xorl %eax, %eax
cmpq (%rdx), %rcx
movb %al, -0x49(%rbp)
je 0x458ba
movq -0x28(%rbp), %rax
cmpq $0x0, 0x18(%rax)
setne %al
movb %al, -0x49(%rbp)
movb -0x49(%rbp), %al
testb $0x1, %al
jne 0x458c3
jmp 0x458de
movq -0x18(%rbp), %rax
movl 0x8(%rax), %ecx
addl $-0x1, %ecx
movl %ecx, 0x8(%rax)
movq -0x28(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x45889
movq -0x40(%rbp), %rcx
movq -0x28(%rbp), %rax
cmpq (%rcx), %rax
je 0x458f7
movq -0x28(%rbp), %rax
movq 0x30(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x458f9
jmp 0x458fb
jmp 0x458fd
xorl %eax, %eax
cmpq $0x0, -0x28(%rbp)
movb %al, -0x4a(%rbp)
je 0x4591a
movq -0x40(%rbp), %rcx
movq -0x28(%rbp), %rax
cmpq (%rcx), %rax
setne %al
movb %al, -0x4a(%rbp)
movb -0x4a(%rbp), %al
testb $0x1, %al
jne 0x4581d
jmp 0x45927
movq -0x18(%rbp), %rax
cmpl $-0x1, 0x8(%rax)
jne 0x45933
jmp 0x45952
leaq 0x25b4f(%rip), %rdi     # 0x6b489
leaq 0x25a14(%rip), %rsi     # 0x6b355
movl $0x186c, %edx           # imm = 0x186C
leaq 0x25b50(%rip), %rcx     # 0x6b49d
callq 0x7180
movq -0x40(%rbp), %rax
movq (%rax), %rsi
leaq -0x38(%rbp), %rdi
callq 0x41c10
movq -0x18(%rbp), %rdi
movq (%rdi), %rax
leaq -0x38(%rbp), %rsi
callq *0x20(%rax)
andb $0x1, %al
movb %al, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x50, %rsp
popq %rbp
retq