зеркало из https://github.com/mono/ikvm-fork.git
- 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:
Родитель
0117d63b18
Коммит
cdbbe4f1c7
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче