Skip to content

InitObj is no longer a basic operation. #22

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: metadata-provider
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions Backend/Transformations/Disassembler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,10 @@ public InstructionTranslator(OperandStack stack, MethodBody body, IType returnTy
this.body = body;
this.returnType = returnType;
}

public override void Visit(Bytecode.InitObjInstruction op)
{
ProcessInitializeObject(op);
}
public override void Visit(Bytecode.BasicInstruction op)
{
switch (op.Operation)
Expand Down Expand Up @@ -172,10 +175,6 @@ public override void Visit(Bytecode.BasicInstruction op)
ProcessInitializeMemory(op);
break;

case Bytecode.BasicOperation.InitObject:
ProcessInitializeObject(op);
break;

case Bytecode.BasicOperation.CopyObject:
ProcessCopyObject(op);
break;
Expand Down Expand Up @@ -328,7 +327,7 @@ private void ProcessInitializeMemory(Bytecode.BasicInstruction op)
body.Instructions.Add(instruction);
}

private void ProcessInitializeObject(Bytecode.BasicInstruction op)
private void ProcessInitializeObject(Bytecode.InitObjInstruction op)
{
var targetAddress = stack.Pop();
var instruction = new Tac.InitializeObjectInstruction(op.Offset, targetAddress);
Expand Down
9 changes: 7 additions & 2 deletions CCIProvider/CodeProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ private IInstruction ExtractInstruction(Cci.IOperation operation)
break;

case Cci.OperationCode.Initobj:
instruction = ProcessBasic(operation);
instruction = ProcessInitObj(operation);
break;

case Cci.OperationCode.Ldarg:
Expand Down Expand Up @@ -751,7 +751,12 @@ private IInstruction ProcessStoreField(Cci.IOperation op)
var instruction = new StoreFieldInstruction(op.Offset, ourField);
return instruction;
}

private IInstruction ProcessInitObj(Cci.IOperation op)
{
var type = typeExtractor.ExtractType(op.Value as Cci.ITypeReference);
var instruction = new InitObjInstruction(op.Offset, type);
return instruction;
}
private IInstruction ProcessBasic(Cci.IOperation op)
{
var operation = OperationHelper.ToBasicOperation(op.OperationCode);
Expand Down
1 change: 0 additions & 1 deletion CCIProvider/OperationHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ public static BasicOperation ToBasicOperation(Cci.OperationCode opcode)
case Cci.OperationCode.Dup: return BasicOperation.Dup;
case Cci.OperationCode.Localloc: return BasicOperation.LocalAllocation;
case Cci.OperationCode.Initblk: return BasicOperation.InitBlock;
case Cci.OperationCode.Initobj: return BasicOperation.InitObject;
case Cci.OperationCode.Cpblk: return BasicOperation.CopyBlock;
case Cci.OperationCode.Cpobj: return BasicOperation.CopyObject;
case Cci.OperationCode.Ret: return BasicOperation.Return;
Expand Down
9 changes: 7 additions & 2 deletions MetadataProvider/AssemblyExtractor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -938,7 +938,7 @@ private IInstruction ExtractInstruction(ILInstruction operation)
break;

case SRM.ILOpCode.Initobj:
instruction = ProcessBasic(operation);
instruction = ProcessInitObj(operation);
break;

case SRM.ILOpCode.Ldarg:
Expand Down Expand Up @@ -1615,7 +1615,12 @@ private IInstruction ProcessStoreField(ILInstruction op)
var instruction = new StoreFieldInstruction(op.Offset, field);
return instruction;
}

private IInstruction ProcessInitObj(ILInstruction op)
{
var type = GetOperand<IType>(op);
var instruction = new InitObjInstruction(op.Offset, type);
return instruction;
}
private IInstruction ProcessBasic(ILInstruction op)
{
var operation = OperationHelper.ToBasicOperation(op.Opcode);
Expand Down
1 change: 0 additions & 1 deletion MetadataProvider/OperationHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,6 @@ public static BasicOperation ToBasicOperation(SRM.ILOpCode opcode)
case SRM.ILOpCode.Dup: return BasicOperation.Dup;
case SRM.ILOpCode.Localloc: return BasicOperation.LocalAllocation;
case SRM.ILOpCode.Initblk: return BasicOperation.InitBlock;
case SRM.ILOpCode.Initobj: return BasicOperation.InitObject;
case SRM.ILOpCode.Cpblk: return BasicOperation.CopyBlock;
case SRM.ILOpCode.Cpobj: return BasicOperation.CopyObject;
case SRM.ILOpCode.Ret: return BasicOperation.Return;
Expand Down
21 changes: 20 additions & 1 deletion Model/Bytecode/Instructions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ public enum BasicOperation
EndFilter,
LocalAllocation,
InitBlock,
InitObject,
CopyObject,
CopyBlock,
LoadArrayLength,
Expand Down Expand Up @@ -167,7 +166,27 @@ protected string ToString(object argument)
return this.ToString("{0}", argument);
}
}
public class InitObjInstruction : Instruction
{
public IType Type { get; }

public InitObjInstruction(uint label, IType type)
: base(label)
{
this.Type = type;
}

public override void Accept(IInstructionVisitor visitor)
{
base.Accept(visitor);
visitor.Visit(this);
}

public override string ToString()
{
return "init obj of type " + Type.ToString();
}
}
public class BasicInstruction : Instruction
{
public BasicOperation Operation { get; set; }
Expand Down
1 change: 1 addition & 0 deletions Model/Bytecode/Visitor/IInstructionVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public interface IInstructionVisitor
{
void Visit(IInstructionContainer container);
void Visit(Instruction instruction);
void Visit(InitObjInstruction instruction);
void Visit(BasicInstruction instruction);
void Visit(LoadInstruction instruction);
void Visit(LoadFieldInstruction instruction);
Expand Down
1 change: 1 addition & 0 deletions Model/Bytecode/Visitor/InstructionVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public virtual void Visit(IInstructionContainer container)
}

public virtual void Visit(Instruction instruction) { }
public virtual void Visit(InitObjInstruction instruction) { }
public virtual void Visit(BasicInstruction instruction) { }
public virtual void Visit(LoadInstruction instruction) { }
public virtual void Visit(LoadFieldInstruction instruction) { }
Expand Down