class CilStLocInstruction extends AbstractCilnstruction {
  public CilStLocInstruction(ProtoIlInstructions.IlInstructionMsg instruction, DotnetBody dotnetBody, CilBlock cilBlock) {
    super(instruction, dotnetBody, cilBlock);
  }

  @Override
  public void jimplify(Body jb) {<FILL_FUNCTION_BODY>}

  @Override
  public Value jimplifyExpr(Body jb) {
    throw new NoExpressionInstructionException(instruction);
  }
}

    CilInstruction cilExpr
        = CilInstructionFactory.fromInstructionMsg(instruction.getValueInstruction(), dotnetBody, cilBlock);
    Value value = cilExpr.jimplifyExpr(jb);

    // if rvalue is isinst, change to instanceof semantic, see description of opcode
    if (cilExpr instanceof CilIsInstInstruction) {
      CilIsInstInstruction isInst = (CilIsInstInstruction) cilExpr;
      Local variable = dotnetBody.variableManager.addOrGetVariable(instruction.getVariable(), jb);
      isInst.resolveRewritingIsInst(jb, variable, value);
      return;
    }

    // rewrite multi array to Jimple semantic, see description of opcode
    if (cilExpr instanceof CilLdElemaInstruction && ((CilLdElemaInstruction) cilExpr).isMultiArrayRef()) {
      CilLdElemaInstruction newArrInstruction = (CilLdElemaInstruction) cilExpr;
      value = newArrInstruction.resolveRewriteMultiArrAccess(jb);
    }

    Local variable = dotnetBody.variableManager.addOrGetVariable(instruction.getVariable(), value.getType(), jb);

    // cast for validation
    if (cilExpr instanceof CilCallVirtInstruction) {
      List<Pair<Local, Local>> locals = ((CilCallVirtInstruction) cilExpr).getLocalsToCastForCall();
      if (locals.size() != 0) {
        for (Pair<Local, Local> pair : locals) {
          CastExpr castExpr = Jimple.v().newCastExpr(pair.getO1(), pair.getO2().getType());
          AssignStmt assignStmt = Jimple.v().newAssignStmt(pair.getO2(), castExpr);
          jb.getUnits().add(assignStmt);
        }
      }
    }
    // create this cast, to validate successfully
    if (value instanceof Local && !variable.getType().toString().equals(value.getType().toString())
        && dotnetBody.variableManager.localsToCastContains(((Local) value).getName())) {
      value = Jimple.v().newCastExpr(value, variable.getType());
    }
    // for validation, because array = obj, where array typeof byte[] and obj typeof System.Object
    if (value instanceof Local && value.getType().toString().equals(DotnetBasicTypes.SYSTEM_OBJECT)
        && !variable.getType().toString().equals(DotnetBasicTypes.SYSTEM_OBJECT)) {
      value = Jimple.v().newCastExpr(value, variable.getType());
    }

    AssignStmt astm = Jimple.v().newAssignStmt(variable, value);
    jb.getUnits().add(astm);

    // if new Obj also add call of constructor, see description of opcode
    if (cilExpr instanceof AbstractNewObjInstanceInstruction) {
      ((AbstractNewObjInstanceInstruction) cilExpr).resolveCallConstructorBody(jb, variable);
    }
  
<methods>public void <init>(ProtoIlInstructions.IlInstructionMsg, soot.dotnet.members.method.DotnetBody, soot.dotnet.instructions.CilBlock) <variables>protected final non-sealed soot.dotnet.instructions.CilBlock cilBlock,protected final non-sealed soot.dotnet.members.method.DotnetBody dotnetBody,protected final non-sealed ProtoIlInstructions.IlInstructionMsg instruction