; int __thiscall CFG__CFG(CFG *this, area_t *a2)
CFG__CFG proc near ; CODE XREF: LOCAL__GenerateCFG+83p
; CALLGRAPH__ConstructVertex+8Cp
var_38__NumBlocks= dword ptr -38h
var_34__ea1= Edge ptr -34h
eavec= QVector ptr -2Ch
BasicBlock= BasicBlock ptr -20h
a2 = dword ptr 4
000 sub esp, 38h
038 push ebx
03C push ebp
040 push esi
044 xor ebx, ebx
044 push edi
048 mov edi, ecx
048 push 1 ; arg_0
04C lea ecx, [esp+4Ch+eavec] ; this
04C mov [edi+CFG.BasicBlockVector__Array], ebx
04C mov [edi+CFG.BasicBlockVector__N], ebx
04C mov [edi+CFG.BasicBlockVector__Alloc], ebx
04C mov [esp+4Ch+eavec.array], ebx
04C mov [esp+4Ch+eavec.n], ebx
04C mov [esp+4Ch+eavec.alloc], ebx
04C call QVECTOR__SIZE4__Reserve ; no need to decompile.
048 mov ebp, [esp+48h+eavec.n]
048 mov ecx, [esp+48h+eavec.array]
048 lea eax, [ecx+ebp*4]
048 cmp eax, ebx
048 jz short loc_10003071
048 mov edx, [esp+48h+a2]
048 mov edx, [edx+area_t.startEA]
048 mov [eax], edx
loc_10003071: ; CODE XREF: CFG__CFG+37j
048 add ebp, 1
048 jz loc_10003225
048 lea ebx, [ebx+0]
loop_top: ; CODE XREF: CFG__CFG+1EFj
048 mov esi, [ecx]
048 lea eax, [ebp*4+0]
048 sar eax, 2
048 sub eax, 1
048 jz short loc_100030A3
048 add eax, eax
048 add eax, eax
048 push eax
04C lea edx, [ecx+4]
04C push edx
050 push ecx
054 call memmove ; Microsoft VisualC 2-8/net runtime
054 add esp, 0Ch
loc_100030A3: ; CODE XREF: CFG__CFG+5Fj
048 sub ebp, 1
048 push esi ; address
04C mov ecx, edi ; this
04C mov [esp+4Ch+eavec.n], ebp
04C call CFG__Split ; decompiled.
048 test al, al
048 jnz loc_10003219
048 mov [esp+48h+BasicBlock.Edges.array], ebx
048 mov [esp+48h+BasicBlock.Edges.n], ebx
048 mov [esp+48h+BasicBlock.Edges.alloc], ebx
048 mov [esp+48h+BasicBlock.Eapairs.array], ebx
048 mov [esp+48h+BasicBlock.Eapairs.n], ebx
048 mov [esp+48h+BasicBlock.Eapairs.alloc], ebx
048 mov [esp+48h+BasicBlock.Boundaries.ea1], esi
048 mov [esp+48h+BasicBlock.Boundaries.ea2], esi
048 mov bl, 1
048 lea esp, [esp+0]
inner_loop_top: ; CODE XREF: CFG__CFG+10Aj
048 push 0
04C push esi
050 call get_flags_ex
048 mov ecx, eax
048 shr ecx, 10h
048 test cl, 1
048 jnz short loc_100030F8
048 cmp esi, [esp+48h+BasicBlock.Boundaries.ea1]
048 jnz short loc_10003171
loc_100030F8: ; CODE XREF: CFG__CFG+C0j
048 and eax, 600h
048 cmp eax, 600h
048 jnz short loc_10003171
048 push esi ; address
04C mov ecx, edi ; this
04C call CFG__Split ; decompiled.
048 test al, al
048 jnz short another_break
048 mov ecx, [esp+48h+a2]
048 lea edx, [esp+48h+BasicBlock]
048 push edx ; block
04C lea eax, [esp+4Ch+eavec]
04C push eax ; eavec
050 push ecx ; address
054 mov ecx, edi
054 call CFG__Member3 ; this is in fact a member function of the class,
; HOWEVER it does not use its this pointer at all.
; decompiled.
048 test al, al
048 jz short loc_1000312C
048 xor bl, bl
loc_1000312C: ; CODE XREF: CFG__CFG+F8j
048 push esi
04C call get_item_end
048 test bl, bl
048 mov esi, eax
048 mov [esp+48h+BasicBlock.Boundaries.ea2], esi
048 jnz short inner_loop_top
048 jmp short loc_10003171
; ---------------------------------------------------------------------------
another_break: ; CODE XREF: CFG__CFG+DEj
048 mov edx, [esp+48h+BasicBlock.Edges.n]
048 add edx, 1
048 push edx
04C lea ecx, [esp+4Ch+BasicBlock.Edges]
04C mov ebp, 3
04C call QVECTOR__SIZE8__Reserve ; no need to decompile.
048 mov eax, [esp+48h+BasicBlock.Edges.n]
048 mov ecx, [esp+48h+BasicBlock.Edges.array]
048 lea eax, [ecx+eax*8]
048 test eax, eax
048 jz short loc_10003168
048 mov [eax+Edge.ea], esi
048 mov [eax+Edge.type], ebp
loc_10003168: ; CODE XREF: CFG__CFG+131j
048 add [esp+48h+BasicBlock.Edges.n], 1
048 mov esi, [esp+48h+BasicBlock.Boundaries.ea2]
loc_10003171: ; CODE XREF: CFG__CFG+C6j
; CFG__CFG+D2j ...
048 mov eax, [edi+CFG.BasicBlockVector__N]
048 mov ecx, [edi+CFG.BasicBlockVector__Alloc]
048 add eax, 1
; reserve()
loc_100031AF: ; CODE XREF: CFG__CFG+14Cj
048 mov ebp, [edi+CFG.BasicBlockVector__N]
048 shl ebp, 5
048 add ebp, [edi+CFG.BasicBlockVector__Array]
048 jz short loc_100031F1
048 mov eax, [esp+48h+BasicBlock.Boundaries.ea1]
048 mov [ebp+BasicBlock.Boundaries.ea2], esi
048 lea ecx, [ebp+BasicBlock.Edges.array]
048 mov [ebp+BasicBlock.Boundaries.ea1], eax
048 xor esi, esi
048 lea edx, [esp+48h+BasicBlock.Edges]
048 push edx
04C mov [ecx+QVector.array], esi
04C mov [ecx+QVector.n], esi
04C mov [ecx+QVector.alloc], esi
04C call QVECTOR__SIZE8__Assign ; no need to decompile.
048 lea ecx, [ebp+BasicBlock.Eapairs.array]
048 lea eax, [esp+48h+BasicBlock.Eapairs]
048 push eax
04C mov [ecx+QVector.array], esi
04C mov [ecx+QVector.n], esi
04C mov [ecx+QVector.alloc], esi
04C call QVECTOR__SIZE8__Assign ; no need to decompile.
048 jmp short loc_100031F3
; ---------------------------------------------------------------------------
loc_100031F1: ; CODE XREF: CFG__CFG+187j
048 xor esi, esi
loc_100031F3: ; CODE XREF: CFG__CFG+1BFj
048 mov eax, [esp+48h+BasicBlock.Eapairs.array]
048 add [edi+CFG.BasicBlockVector__N], 1
048 cmp eax, esi
048 jz short loc_10003205
048 push eax
04C call qfree
loc_10003205: ; CODE XREF: CFG__CFG+1CDj
048 mov eax, [esp+48h+BasicBlock.Edges.array]
048 cmp eax, esi
048 jz short loc_10003213
048 push eax
04C call qfree
loc_10003213: ; CODE XREF: CFG__CFG+1DBj
048 mov ebp, [esp+48h+eavec.n]
048 xor ebx, ebx
loc_10003219: ; CODE XREF: CFG__CFG+84j
048 cmp ebp, ebx
048 mov ecx, [esp+48h+eavec.array]
048 jnz loop_top
loc_10003225: ; CODE XREF: CFG__CFG+44j
048 mov eax, [edi+CFG.BasicBlockVector__N]
048 cmp eax, ebx
048 mov [edi+CFG.NumBlocks], eax
048 mov [esp+48h+var_38__NumBlocks], ebx
048 jle loc_1000331D
second_loop_top: ; CODE XREF: CFG__CFG+2E5j
048 mov edx, [edi+CFG.BasicBlockVector__Array]
048 xor ebp, ebp
048 cmp [ebx+edx+BasicBlock.Edges.n], ebp
048 mov [esp+48h+a2], ebp
048 jle loc_10003304
048 lea esp, [esp+0]
second_inner_loop_top: ; CODE XREF: CFG__CFG+2CAj
048 mov eax, [edi+CFG.BasicBlockVector__Array]
048 mov ecx, [ebx+eax+BasicBlock.Boundaries.ea1]
048 mov edx, [ebx+eax+BasicBlock.Edges.array]
048 mov [esp+48h+var_34__ea1.ea], ecx
048 mov ecx, [edx+ebp*8+Edge.type]
048 lea edx, [edx+ebp*8]
048 mov [esp+48h+var_34__ea1.type], ecx
048 xor ecx, ecx
048 cmp [edi+CFG.NumBlocks], ecx
048 jle short third_inner_loop_follow
048 mov edx, [edx+Edge.ea]
048 mov esi, eax
second_inner_inner_loop_top: ; CODE XREF: CFG__CFG+250j
048 cmp [esi+BasicBlock.Boundaries.ea1], edx
048 jz short loc_10003285
048 add ecx, 1
048 add esi, size BasicBlock
048 cmp ecx, [edi+CFG.NumBlocks]
048 jl short second_inner_inner_loop_top
third_inner_loop_follow: ; CODE XREF: CFG__CFG+23Dj
048 or ecx, 0FFFFFFFFh
loc_10003285: ; CODE XREF: CFG__CFG+245j
048 shl ecx, 5
048 lea esi, [ecx+eax+BasicBlock.Eapairs]
048 mov eax, [esi+QVector.n]
048 mov ecx, [esi+QVector.alloc]
048 add eax, 1
; reserve()
loc_100032D0: ; CODE XREF: CFG__CFG+267j
048 mov eax, [esi+QVector.n]
048 mov ecx, [esi+QVector.array]
048 lea eax, [ecx+eax*8]
048 test eax, eax
048 jz short loc_100032E9
048 mov edx, [esp+48h+var_34__ea1.ea]
048 mov ecx, [esp+48h+var_34__ea1.type]
048 mov [eax], edx
048 mov [eax+4], ecx
loc_100032E9: ; CODE XREF: CFG__CFG+2AAj
048 add [esi+QVector.n], 1
048 mov edx, [edi+CFG.BasicBlockVector__Array]
048 add ebp, 1
048 cmp ebp, [ebx+edx+BasicBlock.Edges.n]
048 mov [esp+48h+a2], ebp
048 jl second_inner_loop_top
048 mov ecx, [esp+48h+eavec.array]
loc_10003304: ; CODE XREF: CFG__CFG+213j
048 mov eax, [esp+48h+var_38__NumBlocks]
048 add eax, 1
048 add ebx, 20h
048 cmp eax, [edi+CFG.NumBlocks]
048 mov [esp+48h+var_38__NumBlocks], eax
048 jl second_loop_top
048 xor ebx, ebx
loc_1000331D: ; CODE XREF: CFG__CFG+201j
048 cmp ecx, ebx
048 jz short loc_10003327
048 push ecx
04C call qfree
loc_10003327: ; CODE XREF: CFG__CFG+2EFj
048 mov eax, edi
048 pop edi
044 pop esi
040 pop ebp
03C pop ebx
038 add esp, 38h
000 retn 4
CFG__CFG endp