// this script was compiled with wurst 1.8.1.0-jenkins-Wurst-1367
globals
integer array A_nextFree
integer A_firstFree=0
integer A_maxIndex=0
integer array A_typeId
integer array A_M_i
endglobals
native testFail takes string message returns nothing
native testSuccess takes nothing returns nothing
function initGlobals takes nothing returns nothing
endfunction

function error takes string msg returns nothing
	call BJDebugMsg(msg + "\n" + "")
endfunction

function dispatch_A_Test_A_f takes integer this returns nothing
	local integer this_1
	if A_typeId[this] == 0 then
		if this == 0 then
			call error("Nullpointer exception when calling A.f")
		else
			call error("Called A.f on invalid object.")
		endif
	endif
	set this_1 = this
	set A_M_i[this_1] = A_M_i[this_1] + 1
	set A_M_i[this_1] = A_M_i[this_1] + 1
endfunction

function dispatch_B_Test_B_g takes integer this returns nothing
	local integer this_1
	if A_typeId[this] == 0 then
		if this == 0 then
			call error("Nullpointer exception when calling B.g")
		else
			call error("Called B.g on invalid object.")
		endif
	endif
	set this_1 = this
	set A_M_i[this_1] = A_M_i[this_1] + 1
	set A_M_i[this_1] = A_M_i[this_1] + 1
	set A_M_i[this_1] = A_M_i[this_1] + 1
endfunction

function new_B takes nothing returns integer
	local integer this
	local integer this_1
	local integer this_2
	local integer this_3
	local integer this_4
	if A_firstFree == 0 then
		if A_maxIndex < 32768 then
			set A_maxIndex = A_maxIndex + 1
			set this_1 = A_maxIndex
			set A_typeId[this_1] = 2
		else
			call error("Out of memory: Could not create B.")
			set this_1 = 0
		endif
	else
		set A_firstFree = A_firstFree - 1
		set this_1 = A_nextFree[A_firstFree]
		set A_typeId[this_1] = 2
	endif
	set this = this_1
	set this_2 = this
	set this_3 = this_2
	set this_4 = this_3
	set A_M_i[this_4] = 0
	return this
endfunction

function init_Test takes nothing returns nothing
	local integer b = new_B()
	local integer a = b
	call dispatch_A_Test_A_f(a)
	call dispatch_B_Test_B_g(b)
	if A_M_i[a] != 5 then
		call testFail("foo")
	endif
	call testSuccess()
endfunction

function main takes nothing returns nothing
	call initGlobals()
	call init_Test()
endfunction

function config takes nothing returns nothing
endfunction