using System;
using System.Collections.Generic;
using System.Reflection.Emit;
using System.Text;
using Sunweaver.DataPrototypes;
namespace Sunweaver.Commands.Abstracts
{
abstract public class UnaryBooleanLogic : BasePair
{
protected VirtualMachine VM;
public override void Implementation(VirtualMachine VM)
{
//fizzle
if (VM.BoolStack.Count() < 1)
return;
this.VM = VM;
Operation(VM.BoolStack.Pop());
}
internal override void Compile(ILGenerator il, Locals locals)
{
var cont = il.DefineLabel();
il.Emit(OpCodes.Ldloc, locals[typeof(VirtualMachine)]);
il.Emit(OpCodes.Ldfld, typeof(VirtualMachine).GetField("BoolStack"));
il.Emit(OpCodes.Call, typeof(BoolStack).GetMethod("Count"));
il.Emit(OpCodes.Ldc_I4_1);
il.Emit(OpCodes.Conv_I8);
il.Emit(OpCodes.Blt_S, cont); // We dont return, just go the end of this method
il.Emit(OpCodes.Ldloc, locals[typeof(VirtualMachine)]);
il.Emit(OpCodes.Ldfld, typeof(VirtualMachine).GetField("BoolStack"));
il.Emit(OpCodes.Call, typeof(BoolStack).GetMethod("Pop"));
il.Emit(OpCodes.Stloc, locals[typeof(bool), 0]);
CompileOperation(il, locals);
il.MarkLabel(cont);
}
///
/// An abstract method child classes implement with the specific implementation
///
/// Top bool value
abstract public void Operation(bool a);
///
/// Abstract interface that child classes implement
///
///
/// The boolean variable is in the locals as bool0.
///
public abstract void CompileOperation(ILGenerator il, Locals locals);
}
}