.assembly extern mscorlib
{
  .ver 0:0:0:0
}

.assembly fptr
{
  .ver 0:0:0:0
}
.module fptr.exe

.method public static void  Main() cil managed
{
	.entrypoint
	.locals init (class MakeDecision d, method instance explicit int32 *(class MakeDecision, int32) m, int32 i)

	ldc.i4.1
	ldc.i4 42
	newobj     instance void MakeDecision::.ctor(bool, int32)
	stloc d

	ldc.i4.0
	stloc i
	br test

loop:
	ldloc d
	call       instance method instance explicit int32 *(class MakeDecision, int32) MakeDecision::Decide()
	stloc m

	ldloc d
	ldc.i4.1
	ldloc m
	calli      instance int32(int32)
	call       void [mscorlib]System.Console::WriteLine(int32)

	ldloc i
	ldc.i4.1
	add
	stloc i

test:
	ldloc i
	ldc.i4 10
	blt loop

	ret
}

.class public auto ansi sealed MakeDecision
       extends [mscorlib]System.Object
{
	.field private bool Oscillate
	.field private int32 Value

	.method public instance method instance explicit int32 *(class MakeDecision, int32) Decide() cil managed
	{
		.locals init (bool t)

		ldarg.0
		ldfld     bool MakeDecision::Oscillate
		stloc t

		ldarg.0
		ldloc t
		ldc.i4.0
		ceq
		stfld bool MakeDecision::Oscillate

		ldloc t
		brfalse subs

		ldftn      instance int32 MakeDecision::Add(int32)
		ret

	subs:
		ldftn      instance int32 MakeDecision::Sub(int32)
		ret
	}

	.method public int32  Add(int32 i) cil managed
	{
		ldarg.0
		ldfld      int32 MakeDecision::Value
		ldarg      i
		add
		ret
	}

	.method public int32  Sub(int32 i) cil managed
	{
		ldarg.0
		ldfld      int32 MakeDecision::Value
		ldarg      i
		sub
		ret
	}

	.method public hidebysig specialname rtspecialname  instance void  .ctor(bool s, int32 val) cil managed
	{
		ldarg.0
		ldarg s
		stfld      bool MakeDecision::Oscillate

		ldarg.0
		ldarg val
		stfld      int32 MakeDecision::Value

		ldarg.0
		call       instance void [mscorlib]System.Object::.ctor()
		ret
	}
}