- Turn pops in map.mxl into lazy pop to annihilate constants.

- Fixed "replace-method-call" to not emit line numbers from map.xml (which don't make sense in the context of another method and disrupt the lazy pop optimizations).
This commit is contained in:
jfrijters 2009-07-14 09:31:20 +00:00
Родитель 0117d63b18
Коммит cdbbe4f1c7
2 изменённых файлов: 16 добавлений и 5 удалений

Просмотреть файл

@ -1156,19 +1156,29 @@ namespace IKVM.Internal
{
}
private void DoEmit(CodeEmitter ilgen)
{
IKVM.Internal.MapXml.CodeGenContext context = new IKVM.Internal.MapXml.CodeGenContext(this.DeclaringType.GetClassLoader());
// we don't want the line numbers from map.xml, so we have our own emit loop
for (int i = 0; i < code.invoke.Length; i++)
{
code.invoke[i].Generate(context, ilgen);
}
}
internal override void EmitCall(CodeEmitter ilgen)
{
code.Emit(DeclaringType.GetClassLoader(), ilgen);
DoEmit(ilgen);
}
internal override void EmitCallvirt(CodeEmitter ilgen)
{
code.Emit(DeclaringType.GetClassLoader(), ilgen);
DoEmit(ilgen);
}
internal override void EmitNewobj(CodeEmitter ilgen, MethodAnalyzer ma, int opcodeIndex)
{
code.Emit(DeclaringType.GetClassLoader(), ilgen);
DoEmit(ilgen);
}
}

Просмотреть файл

@ -269,10 +269,11 @@ namespace IKVM.Internal.MapXml
}
[XmlType("pop")]
public sealed class Pop : Simple
public sealed class Pop : Instruction
{
public Pop() : base(OpCodes.Pop)
internal override void Generate(CodeGenContext context, CodeEmitter ilgen)
{
ilgen.LazyEmitPop();
}
}