private void CompileGoalVariable(PrologCodeVariable var, int i)
{
PrologVariableDictionaryEntry entry = _dictionary.GetVariable(var.Name);
if (entry.IsTemporary)
{
if (entry.TemporaryIndex != i)
{
ResolveConflicts(var, i);
}
if (entry.IsReferenced)
{
if (entry.TemporaryIndex != i)
{
_generator.Emit(OpCodes.Put_Value, X(entry.TemporaryIndex), X(i));
}
}
else
{
if (entry.TemporaryIndex != i)
{
_generator.Emit(OpCodes.Put_Variable, X(entry.TemporaryIndex), X(i));
}
else
{
_generator.Emit(OpCodes.Put_Variable, X(i), X(i));
}
entry.IsGlobal = true;
}
}
else
{
ResolveConflicts(var, i);
if (entry.IsReferenced)
{
if (entry.IsUnsafe && !entry.IsGlobal &&
_dictionary.InLastGoal)
{
_generator.Emit(OpCodes.Put_Unsafe_Value, Y(entry.PermanentIndex), X(i));
entry.IsUnsafe = false;
}
else
{
if (entry.TemporaryIndex != -1)
{
_generator.Emit(OpCodes.Put_Value, X(entry.TemporaryIndex), X(i));
}
else
{
_generator.Emit(OpCodes.Put_Value, Y(entry.PermanentIndex), X(i));
}
}
}
else
{
_generator.Emit(OpCodes.Put_Variable, Y(entry.PermanentIndex), X(i));
}
if (entry.TemporaryIndex == -1)
{
entry.TemporaryIndex = i;
}
else
{
// No
}
}
}