code: private void simulate(final Instruction instruction) {
          switch (instruction.getType()) {
              case PUSH:
                  final PushInstruction pushInstruction = (PushInstruction) instruction;
                  runtimeStack.push(new Element(pushInstruction.getValueType(), pushInstruction.getValue()));
                  break;
              case METHOD_HANDLE:
                  simulateMethodHandle((InvokeDynamicInstruction) instruction);
                  break;
              case INVOKE:
                  simulateInvoke((InvokeInstruction) instruction);
                  break;
              case GET_FIELD:
                  runtimeStack.pop();
                  runtimeStack.push(new Element(((GetFieldInstruction) instruction).getPropertyType()));
                  break;
              case GET_STATIC:
                  final GetStaticInstruction getStaticInstruction = (GetStaticInstruction) instruction;
                  final Object value = getStaticInstruction.getValue();
                  if (value != null)
                      runtimeStack.push(new Element(getStaticInstruction.getPropertyType(), value));
                  else
                      runtimeStack.push(new Element(getStaticInstruction.getPropertyType()));
                  break;
              case LOAD:
                  final LoadInstruction loadInstruction = (LoadInstruction) instruction;
                  runtimeStack.push(localVariables.getOrDefault(loadInstruction.getNumber(), new Element(loadInstruction.getVariableType())));
                  runtimeStack.peek().getTypes().add(loadInstruction.getVariableType());
                  variableInvalidation.add(loadInstruction.getValidUntil(), loadInstruction.getNumber());
                  break;
              case STORE:
                  simulateStore((StoreInstruction) instruction);
                  break;
              case SIZE_CHANGE:
                  simulateSizeChange((SizeChangingInstruction) instruction);
                  break;
              case NEW:
                  final NewInstruction newInstruction = (NewInstruction) instruction;
                  runtimeStack.push(new Element(toType(newInstruction.getClassName())));
                  break;
              case DUP:
                  runtimeStack.push(runtimeStack.peek());
                  break;
              case OTHER:
                  // do nothing
                  break;
              case RETURN:
                  mergeReturnElement(runtimeStack.pop());
              case THROW:
                  mergePossibleResponse();
                  // stack has to be empty for further analysis
                  runtimeStack.clear();
                  break;
              default:
                  throw new IllegalArgumentException("Instruction without type!");
          }
  
          if (instruction.getLabel() != active && variableInvalidation.containsKey(active)) {
              variableInvalidation.get(active).forEach(localVariables::remove);
          }
          active = instruction.getLabel();
      }
docs: Simulates the instruction.
  
  @param instruction The instruction to simulate