Equation (Member method, MethodNode methodNode, boolean stable, boolean jsr) { EKey key = new EKey(method, Direction.Pure, stable); Effects hardCodedSolution = HardCodedPurity.getInstance().getHardCodedSolution(method); if (hardCodedSolution != null) { return new Equation(key, hardCodedSolution); } if ((methodNode.access & UN_ANALYZABLE_FLAG) != 0) return null; if (methodNode.instructions.size() > 1000) { // Skip purity analysis for very long methods, as it's rarely useful return null; } DataInterpreter dataInterpreter = new DataInterpreter(methodNode); try { if (jsr) { new Analyzer<>(dataInterpreter).analyze("this", methodNode); } else { new LiteAnalyzer<>(dataInterpreter).analyze("this", methodNode); } } catch (AnalyzerException e) { return null; } EffectQuantum[] quanta = dataInterpreter.effects; DataValue returnValue = dataInterpreter.returnValue == null ? DataValue.UnknownDataValue1 : dataInterpreter.returnValue; List<EffectQuantum> effects = new ArrayList<>(); for (EffectQuantum effectQuantum : quanta) { if (effectQuantum != null) { if (effectQuantum == EffectQuantum.TopEffectQuantum) { return returnValue == DataValue.UnknownDataValue1 ? null : new Equation(key, new Effects(returnValue, Effects.TOP_EFFECTS)); } effects.add(effectQuantum); } } return new Equation(key, new Effects(returnValue, Set.copyOf(effects))); }